{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "XXDeo-aGOAXF"
   },
   "source": [
    "##### Copyright 2020 The TensorFlow Authors.\n",
    "\n",
    "Licensed under the Apache License, Version 2.0 (the \"License\");"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "9XRGdjHNOE9D"
   },
   "outputs": [],
   "source": [
    "#@title ##### Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n",
    "# you may not use this file except in compliance with the License.\n",
    "# You may obtain a copy of the License at\n",
    "#\n",
    "# https://www.apache.org/licenses/LICENSE-2.0\n",
    "#\n",
    "# Unless required by applicable law or agreed to in writing, software\n",
    "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
    "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
    "# See the License for the specific language governing permissions and\n",
    "# limitations under the License."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "KJihamFwOLUT"
   },
   "source": [
    "# VIB + DoSE\n",
    "\n",
    "<table class=\"tfo-notebook-buttons\" align=\"left\">\n",
    "  <td>\n",
    "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/probability/blob/master/tensorflow_probability/python/experimental/nn/examples/vib_dose.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />Run in Google Colab</a>\n",
    "  </td>\n",
    "  <td>\n",
    "    <a target=\"_blank\" href=\"https://github.com/tensorflow/probability/blob/master/tensorflow_probability/python/experimental/nn/examples/vib_dose.ipynb\"><img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" />View source on GitHub</a>\n",
    "  </td>\n",
    "</table>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "IaFh9M5MRAd0"
   },
   "source": [
    "In this example, we train a deep variational information bottleneck model (VIB) on the MNIST dataset.  We then use density of states estimation to turn our VIB model into an Out-of-distribution (OOD) detector.  Our current implementation achieves near-SOTA performance on both OOD detection and classification simultaneously without any exposure to OOD data during training.\n",
    "\n",
    "## References\n",
    "\n",
    "The VIB paper (Alemi et al. 2016) can be found [Here](https://arxiv.org/abs/1612.00410)\n",
    "\n",
    "The DoSE paper (Morningstar et al. 2020) can be found [Here](https://arxiv.org/abs/2006.09273)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "B0HrNKbJw2bA"
   },
   "source": [
    "### 1  Imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "cellView": "both",
    "colab": {},
    "colab_type": "code",
    "id": "cttwhYKYGhPj"
   },
   "outputs": [],
   "source": [
    "from __future__ import absolute_import\n",
    "from __future__ import division\n",
    "from __future__ import print_function\n",
    "\n",
    "import functools\n",
    "import sys\n",
    "import time\n",
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import tensorflow.compat.v2 as tf\n",
    "tf.enable_v2_behavior()\n",
    "\n",
    "import tensorflow_datasets as tfds\n",
    "import tensorflow_probability as tfp\n",
    "\n",
    "# Globally Enable XLA.\n",
    "# tf.config.optimizer.set_jit(True)\n",
    "\n",
    "try:\n",
    "  physical_devices = tf.config.list_physical_devices('GPU')\n",
    "  tf.config.experimental.set_memory_growth(physical_devices[0], True)\n",
    "except:\n",
    "  # Invalid device or cannot modify virtual devices once initialized.\n",
    "  pass\n",
    "\n",
    "tfb = tfp.bijectors\n",
    "tfd = tfp.distributions\n",
    "tfn = tfp.experimental.nn"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "nbQ3rcTowypZ"
   },
   "source": [
    "### 2  Load Dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "cellView": "both",
    "colab": {
     "height": 150
    },
    "colab_type": "code",
    "id": "rjgnFMxvG9Ab",
    "outputId": "7751f329-299e-4c0c-9960-be487e996ba0"
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsgAAABmCAYAAADWImfBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAGK9JREFUeJzt3XmUHGX1xvEnrkBYZJcQFIUQ2SIk\nKjlEUDYFBLcDKEgQMICIRGQxIIsQECRCgAPIFkBAQUWQALKEfZOobMbACWsMoGBiQFlEQc3vj995\n3ro1XdPTnemurun5fv5J5a2e7pqe7urq+7733iGLFi1aJAAAAACSpLd1+gAAAACAKuECGQAAAAi4\nQAYAAAACLpABAACAgAtkAAAAIOACGQAAAAi4QAYAAAACLpABAACAgAtkAAAAIHhHmQ82ZMiQMh8O\nAAAA6FVvDaWJIAMAAAABF8gAAABAwAUyAAAAEHCBDAAAAARcIAMAAAABF8gAAABAUGqZNwDA4LHN\nNttIkg444IA09tnPflaSNGXKFEnS4YcfXv6BAUAfiCADAAAAARfIAAAAQDBkUW8tRNrxYAOsk95q\nq60mSVphhRUkSf/5z3/Svscff7wjx9SI0aNHS5K+9rWvpbH9999fkjR9+nRJ0owZM+rex2OPPSZJ\nuuuuu9pxiAC6jM+Xn/70p9PY1KlTJUnLLbdcze3feustSfnlFxdeeGE7DxElede73iVJeve7312z\nb+utt07b3/ve9yRJG264Yc3tvO+EE05oxyFWhi/BjjvuuDR27LHHduhoOm/ppZeWJF1wwQVp7Mtf\n/rIkaebMmWnM55lXXnml349JJz0AAACgASTp9bD22mun7TvuuENSFhlxxEOSzjnnHEnSwQcfXOLR\n9W6jjTZK29dff70kadVVV01j/obkBBn/25uXX35ZknT33XenMUeDnn/+eUnSn/70p34eNYCByFGe\n3XffPY3tvffekqQxY8Y0dB9vf/vbJUnLLLNMi4+udd7xjuwjcsKECZKkESNG1NzutddekyRNmzYt\njc2fP1+S9O9//7udh9hy/ruMHDkyje23335N3ceoUaMkSZtttlka8wxyUbSuaGyTTTZp6jEHmp5R\n4k984hOdOZAK+NCHPpS2b7jhBknSmmuumcb8+oivifHjx0uSzj777LYdFxFkAAAAIOACGQAAAAi6\n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\n4IADyj2wDvHU9tSpU9PYSSedJClfV7teQtnjjz8uKd9Jr50JNz35c6DMbnVeWuHlKHHpkx8zLt/z\n0gMnDVaJl1E0u8wqLrvwtp+PO++8M+1zbf3Ir5UVVlhBkvTXv/61qccuQ+zR0FP8/QabZrsxFnXk\ndB1sSXr11Vf7fUx9IYIMAAAABJWJIDvxRcq+gTnCINVPynOSQFwc78X8MXnM38xPOeUUSfnol6No\n1113XRpbuHChpCz5IHb0ueSSSyTlExnK8tprr6XtekkKMZLjhEdHUxtN9FhiiSXStsvuuHNdvaix\nJD3//POSsiS2bhKfP3f5qYpYjs3JRjG67ddFUQJNkRVXXDH3/xg973bu9ub3u5RFjn/7299KykeN\nY0JqNyv6PT2T4hJOfXFi7NNPP926A2vCk08+KSmfbNwOsZSbZzFj5LinOOM1bdq09h1YL1yuLX7e\nuRvks88+m8Z8Xu9PybVRo0ZJkg477DBJxVHjyJ8pVUuSj9ce9ZL0uj2C7GumIrfffntD9+FZz3jO\ntTh7/sYbbzR5dM0jggwAAAAEXCADAAAAQWWWWMRkOicrFCV4eDpsq622SmNOsCvqynPzzTenbU91\nNTol5Dqx7oTlmrlSVutz/PjxDd1Xu3iZSFE3r1VWWSVtu5bz8OHDJUkzZ85M+9ztKibLOJHLt5ek\n3Xbbralj23DDDSV1ZhnKYOQOVccff3wac0LdpptumsYaWVoRu2L5Ne5pzZjw1+0uuugiSdK6666b\nxvx69rTwQF1WEevtNmvllVeWJE2aNCmNeTmKE2WjmFzjWtt9Jca2mxPDvvWtb7XsPnfYYYe0fdRR\nR0mSNt544zTm6eOiJEAnp3diWUV06KGHSiqu2Ttu3Li07d/1mWeekZTVoJekG264oeZnjzjiCEn5\n393dFJ101xd/BrkrblXUW1YxmMyYMaPXfe64KEkvvfRSbl9cFuilPfE5dRe+spdrEkEGAAAAgspE\nkGNCmb9hxnIp7lDlSKn7cEtZSa+YQOBvmjFa3GyXJifhuIOe+4xLWURuu+22S2OxU0xZJk+eLClf\n8uQHP/hBr7f3cxqfW0dQYkJevWhQkauvvlpSvitbGWVY2ikm1zg6W2VOnltqqaXSmL+px7+to1gW\nO1s5ohPLd3nMr7UFCxa08rArJybd7bHHHjX7Xfbu3nvvLe2Y2iEm+26++eaS8hGaGPlsRFFU1LMN\n8dw5b968pu63Xfz7F0XSY7SrJ7+/YvLq0UcfLSl//ivix/JsTKcT8orEmcd63CXRHSVjZ8mimVX/\n7o2W0HNCXuyKGkuzVkm90m7RscceW7jdLfx5c9ddd6UxPzeemZCyIgqOHMeEUJfNjOcnd+Isu5Qq\nEWQAAAAgGLKoXRXRix6szpq3+O15zz33rNn/2GOPSZLuuOMOSdI999yT9vmbZlxX2w6x7IjX9Dpy\nIGWF8jshRgV9THF9YFzj04h63/YdQYxrCCdOnCipemvD+uNHP/pR2naZIzv11FPTtteiVkWMCF94\n4YWSGo8GesYgRgD8t43rSLvRkksuKSn/GnZJt7i2bpdddpHUnWvrXcpRykperr/++g39rM/JMXfE\nTVVi45mqcKR09uzZkorXwV511VU1Y87LiA1zGo2O+vk4+eSTJWWfZ1XiWYRWN71p5DlyPoyUzeD5\n71NljV5GbbHFFmm7m0u+eUZKymbWY1k2/02HDh0qSRozZkza58hxzIlq93PV29+PCDIAAAAQcIEM\nAAAABJVZYhHLSsXud+ZlFJ2c1nRpo7gdu0CVvYC8L7vvvnvadqLVCSec0NDPOkkvlvQ67bTTJEkP\nP/ywpCyJsVvVW2LhEnZStZceuJ99LIvYU0yamjNnjqTB1S3PXB4vlpz00oCYgFRGByeUZ5111pEk\n7b///mlswoQJkvIJr/U+KouWD7hzmJdVSNKUKVNacMTt5c/insm8Ura8SKrtehfPkcsvv3zNz7qr\npxPupaxE4rnnnisp/xnabFJ9J/V1GdWfkooD3bBhwyRl3Xwlacstt5SU/f3dhVPKkqDLXFrDEgsA\nAACgAZWJIANV0w0RZNQXS3XNnTtXUr6E5LbbbiupfgF8dJ/VVltNUhbpkvLJrz29/vrrkvLJ5vPn\nz5eUlXQDUE1EkAEAAIAGcIEMAAAABCyxAHoxatSotH3++edLkk488URJ+fqlA71j4GAWa65fdNFF\nNftdp5PEPADoTiyxAAAAABpQW8cFgCRp1qxZaXvs2LEdPBK0S0zIK3LooYdKykrAAQAGByLIAAAA\nQMAFMgAAABCQpAcAAIBBiSQ9AAAAoAGlJumVGKwGAAAAFgsRZAAAACDgAhkAAAAIuEAGAAAAAi6Q\nAQAAgIALZAAAACDgAhkAAAAIuEAGAAAAAi6QAQAAgIALZAAAACDgAhkAAAAIuEAGAAAAAi6QAQAA\ngIALZAAAACDgAhkAAAAIuEAGAAAAAi6QAQAAgIALZAAAACDgAhkAAAAIuEAGAAAAAi6QAQAAgIAL\nZAAAACDgAhkAAAAIuEAGAAAAgv8DFuzI4PE2ZsEAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 1000x200 with 1 Axes>"
      ]
     },
     "metadata": {
      "tags": []
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "(<Figure size 1000x200 with 1 Axes>,\n",
       " <matplotlib.axes._subplots.AxesSubplot at 0x7f32fd30ce48>)"
      ]
     },
     "execution_count": 0,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[train_dataset, eval_dataset], datasets_info = tfds.load(\n",
    "    name='mnist',\n",
    "    split=['train', 'test'],\n",
    "    with_info=True,\n",
    "    shuffle_files=True)\n",
    "\n",
    "def _preprocess(sample):\n",
    "  return (tf.cast(sample['image'], tf.float32) * 2 / 255. - 1.,\n",
    "          tf.cast(sample['label'], tf.int32))\n",
    "\n",
    "train_size = datasets_info.splits['train'].num_examples\n",
    "batch_size = 32\n",
    "\n",
    "train_dataset = tfn.util.tune_dataset(\n",
    "    train_dataset,\n",
    "    batch_size=batch_size,\n",
    "    shuffle_size=int(train_size  / 7),\n",
    "    preprocess_fn=_preprocess)\n",
    "\n",
    "eval_dataset = tfn.util.tune_dataset(\n",
    "    eval_dataset,\n",
    "    repeat_count=1,\n",
    "    preprocess_fn=_preprocess)\n",
    "\n",
    "x = next(iter(eval_dataset.batch(10)))[0]\n",
    "tfn.util.display_imgs(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "sbaPm7ABwvde"
   },
   "source": [
    "### 3  Define Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "iK6_hK6RyunW"
   },
   "outputs": [],
   "source": [
    "input_shape = datasets_info.features['image'].shape\n",
    "encoded_size = 16\n",
    "base_depth = 32"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "N3Q78OptyyOx"
   },
   "outputs": [],
   "source": [
    "prior = tfd.MultivariateNormalDiag(\n",
    "    loc=tf.zeros(encoded_size),\n",
    "    scale_diag=tf.ones(encoded_size))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 287
    },
    "colab_type": "code",
    "id": "96g5flbdy6lK",
    "outputId": "8d52909d-5a7f-4fd9-82e6-1bab750a4683"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "=== encoder ==================================================\n",
      "  SIZE SHAPE                TRAIN NAME                                    \n",
      "    32 [32]                 True  bias:0                                  \n",
      "   800 [5, 5, 1, 32]        True  kernel:0                                \n",
      "    32 [32]                 True  bias:0                                  \n",
      " 25600 [5, 5, 32, 32]       True  kernel:0                                \n",
      "    64 [64]                 True  bias:0                                  \n",
      " 51200 [5, 5, 32, 64]       True  kernel:0                                \n",
      "    64 [64]                 True  bias:0                                  \n",
      "102400 [5, 5, 64, 64]       True  kernel:0                                \n",
      "    64 [64]                 True  bias:0                                  \n",
      "200704 [7, 7, 64, 64]       True  kernel:0                                \n",
      "   152 [152]                True  bias:0                                  \n",
      "  9728 [64, 152]            True  kernel:0                                \n",
      "trainable size: 390840  /  1.491 MiB  /  {float32: 390840}\n"
     ]
    }
   ],
   "source": [
    "Conv = functools.partial(\n",
    "    tfn.Convolution,\n",
    "    init_bias_fn=tf.zeros_initializer(),\n",
    "    init_kernel_fn=tf.initializers.he_uniform())  # Better for leaky_relu.\n",
    "\n",
    "encoder = tfn.Sequential([\n",
    "    lambda x: 2. * tf.cast(x, tf.float32) - 1.,  # Center.\n",
    "    Conv(1, 1 * base_depth, 5, strides=1, padding='same'),\n",
    "    tf.nn.leaky_relu,\n",
    "    Conv(1 * base_depth, 1 * base_depth, 5, strides=2, padding='same'),\n",
    "    tf.nn.leaky_relu,\n",
    "    Conv(1 * base_depth, 2 * base_depth, 5, strides=1, padding='same'),\n",
    "    tf.nn.leaky_relu,\n",
    "    Conv(2 * base_depth, 2 * base_depth, 5, strides=2, padding='same'),\n",
    "    tf.nn.elu,\n",
    "    Conv(2 * base_depth, 4 * encoded_size, 7, strides=1, padding='valid'),\n",
    "    tf.nn.leaky_relu,\n",
    "    tfn.util.flatten_rightmost(ndims=3),\n",
    "    tfn.Affine(4*encoded_size, encoded_size + encoded_size * (encoded_size + 1) // 2),\n",
    "    lambda x: tfd.MultivariateNormalTriL(\n",
    "        loc=x[..., :encoded_size],\n",
    "        scale_tril=tfb.FillScaleTriL()(x[..., encoded_size:]))\n",
    "], name='encoder')\n",
    "\n",
    "print(encoder.summary())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 107
    },
    "colab_type": "code",
    "id": "P6cn2Qhh0lkz",
    "outputId": "7fca6506-f16c-44ee-cce8-7a421b1704ca"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "=== Affine__lambda ==================================================\n",
      "  SIZE SHAPE                TRAIN NAME                                    \n",
      "    10 [10]                 True  bias:0                                  \n",
      "   160 [16, 10]             True  kernel:0                                \n",
      "trainable size: 170  /  0.001 MiB  /  {float32: 170}\n"
     ]
    }
   ],
   "source": [
    "DeConv = functools.partial(\n",
    "    tfn.ConvolutionTranspose,\n",
    "    init_kernel_fn=tf.initializers.he_uniform())  # Better for leaky_relu.\n",
    "    \n",
    "Affine = functools.partial(\n",
    "    tfn.Affine,\n",
    "    init_kernel_fn=tf.initializers.he_uniform())\n",
    "\n",
    "decoder = tfn.Sequential([\n",
    "    Affine(encoded_size, 10),\n",
    "    lambda x: tfd.Categorical(logits=x)])\n",
    "\n",
    "print(decoder.summary())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "J9XuHd6Iw7_a"
   },
   "source": [
    "### 4  Loss / Eval"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "z90ohRKUs0xL"
   },
   "outputs": [],
   "source": [
    "def compute_loss(x, y, beta=1.):\n",
    "  q = encoder(x)\n",
    "  z = q.sample()\n",
    "  p = decoder(z)\n",
    "  kl = tf.reduce_mean(q.log_prob(z) - prior.log_prob(z), axis=-1)\n",
    "  # Note: we could use exact KL divergence, eg:\n",
    "  #   kl = tf.reduce_mean(tfd.kl_divergence(q, prior))\n",
    "  # however we generally find that using the Monte Carlo approximation has\n",
    "  # lower variance.\n",
    "  nll = -tf.reduce_mean(p.log_prob(y), axis=-1)\n",
    "  loss = nll + beta * kl\n",
    "  return loss, (nll, kl), (q, z, p)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "6PO6SxWm_5RA"
   },
   "outputs": [],
   "source": [
    "train_iter = iter(train_dataset)\n",
    "\n",
    "def loss():\n",
    "  x, y = next(train_iter)\n",
    "  loss, (nll, kl), _ = compute_loss(x, y, beta=0.075)\n",
    "  return loss, (nll, kl)\n",
    "\n",
    "opt = tf.optimizers.Adam(learning_rate=1e-3, decay=0.00005)\n",
    "\n",
    "fit = tfn.util.make_fit_op(\n",
    "    loss,\n",
    "    opt,\n",
    "    decoder.trainable_variables + encoder.trainable_variables,\n",
    "    grad_summary_fn=lambda gs: tf.nest.map_structure(tf.norm, gs))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "cellView": "code",
    "colab": {},
    "colab_type": "code",
    "id": "iUmS-7IATIcI"
   },
   "outputs": [],
   "source": [
    "eval_iter = iter(eval_dataset.batch(5000).repeat())\n",
    "\n",
    "@tfn.util.tfcompile\n",
    "def eval():\n",
    "  x, y = next(eval_iter)\n",
    "  loss, (nll, kl), _ = compute_loss(x, y, beta=0.05)\n",
    "  return loss, (nll, kl)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "QuCSidxVABmA"
   },
   "source": [
    "### 5  Train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "xKbiQZcu-z5l"
   },
   "outputs": [],
   "source": [
    "DEBUG_MODE = False\n",
    "tf.config.experimental_run_functions_eagerly(DEBUG_MODE)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "cellView": "both",
    "colab": {
     "height": 1000
    },
    "colab_type": "code",
    "id": "ba5W_N6oTNbo",
    "outputId": "c8705f83-d522-4db3-87e2-852c649ffbc6"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "it:    1   ms/it:2564.3797   trn_loss:22.1861   tst_loss:19.4266   tst_nll:10.1761   tst_kl:185.0093   sum_norm_grad:845.5634\n",
      "it:  235   ms/it:2.2164   trn_loss:1.5428   tst_loss:1.3213   tst_nll:0.9611   tst_kl:7.2048   sum_norm_grad:14.4196\n",
      "it:  469   ms/it:2.1324   trn_loss:0.9982   tst_loss:0.9201   tst_nll:0.5909   tst_kl:6.5845   sum_norm_grad:10.1642\n",
      "it:  703   ms/it:2.1391   trn_loss:0.9315   tst_loss:0.7142   tst_nll:0.3821   tst_kl:6.6419   sum_norm_grad:14.4733\n",
      "it:  937   ms/it:2.1684   trn_loss:0.9210   tst_loss:0.6675   tst_nll:0.3780   tst_kl:5.7918   sum_norm_grad:14.7734\n",
      "it: 1171   ms/it:2.1175   trn_loss:0.7251   tst_loss:0.5506   tst_nll:0.2207   tst_kl:6.5989   sum_norm_grad:8.4730\n",
      "it: 1405   ms/it:2.0846   trn_loss:0.6943   tst_loss:0.5861   tst_nll:0.3270   tst_kl:5.1835   sum_norm_grad:9.5136\n",
      "it: 1639   ms/it:2.1750   trn_loss:0.6642   tst_loss:0.5858   tst_nll:0.3445   tst_kl:4.8274   sum_norm_grad:6.8234\n",
      "it: 1873   ms/it:2.0080   trn_loss:0.5778   tst_loss:0.5379   tst_nll:0.2793   tst_kl:5.1727   sum_norm_grad:7.8218\n",
      "it: 2107   ms/it:2.0313   trn_loss:0.7633   tst_loss:0.4800   tst_nll:0.1764   tst_kl:6.0714   sum_norm_grad:13.6137\n",
      "it: 2341   ms/it:2.0713   trn_loss:0.5730   tst_loss:0.4819   tst_nll:0.2155   tst_kl:5.3266   sum_norm_grad:6.4923\n",
      "it: 2575   ms/it:1.9554   trn_loss:0.5458   tst_loss:0.4853   tst_nll:0.2122   tst_kl:5.4622   sum_norm_grad:6.2071\n",
      "it: 2809   ms/it:1.9702   trn_loss:0.5840   tst_loss:0.4678   tst_nll:0.2076   tst_kl:5.2025   sum_norm_grad:7.0371\n",
      "it: 3043   ms/it:2.0315   trn_loss:0.4956   tst_loss:0.4598   tst_nll:0.2057   tst_kl:5.0823   sum_norm_grad:5.5657\n",
      "it: 3277   ms/it:2.0027   trn_loss:0.7635   tst_loss:0.5070   tst_nll:0.2752   tst_kl:4.6358   sum_norm_grad:12.0438\n",
      "it: 3511   ms/it:2.1219   trn_loss:0.5925   tst_loss:0.4679   tst_nll:0.2242   tst_kl:4.8740   sum_norm_grad:7.9167\n",
      "it: 3745   ms/it:2.0533   trn_loss:0.4950   tst_loss:0.4469   tst_nll:0.2054   tst_kl:4.8289   sum_norm_grad:6.2624\n",
      "it: 3979   ms/it:2.0403   trn_loss:0.5245   tst_loss:0.4639   tst_nll:0.2495   tst_kl:4.2869   sum_norm_grad:8.0653\n",
      "it: 4213   ms/it:2.0021   trn_loss:0.4222   tst_loss:0.4056   tst_nll:0.1512   tst_kl:5.0866   sum_norm_grad:3.7033\n",
      "it: 4447   ms/it:2.0186   trn_loss:0.5910   tst_loss:0.4387   tst_nll:0.1962   tst_kl:4.8495   sum_norm_grad:12.2965\n",
      "it: 4681   ms/it:1.9985   trn_loss:0.4816   tst_loss:0.4088   tst_nll:0.1494   tst_kl:5.1885   sum_norm_grad:6.8221\n",
      "it: 4915   ms/it:1.9830   trn_loss:0.6091   tst_loss:0.4167   tst_nll:0.1475   tst_kl:5.3833   sum_norm_grad:9.1217\n",
      "it: 5149   ms/it:1.8724   trn_loss:0.5090   tst_loss:0.4217   tst_nll:0.1713   tst_kl:5.0073   sum_norm_grad:7.9420\n",
      "it: 5383   ms/it:1.8790   trn_loss:0.4645   tst_loss:0.4319   tst_nll:0.1895   tst_kl:4.8482   sum_norm_grad:5.6776\n",
      "it: 5617   ms/it:1.8531   trn_loss:0.4660   tst_loss:0.4289   tst_nll:0.1903   tst_kl:4.7722   sum_norm_grad:5.7069\n",
      "it: 5851   ms/it:1.8618   trn_loss:0.6393   tst_loss:0.4061   tst_nll:0.1760   tst_kl:4.6033   sum_norm_grad:9.4343\n",
      "it: 6085   ms/it:1.8427   trn_loss:0.6755   tst_loss:0.3991   tst_nll:0.1175   tst_kl:5.6326   sum_norm_grad:12.9892\n",
      "it: 6319   ms/it:1.8549   trn_loss:0.4403   tst_loss:0.4069   tst_nll:0.1804   tst_kl:4.5294   sum_norm_grad:5.7477\n",
      "it: 6553   ms/it:1.8505   trn_loss:0.4728   tst_loss:0.3854   tst_nll:0.1366   tst_kl:4.9755   sum_norm_grad:8.0551\n",
      "it: 6787   ms/it:1.8351   trn_loss:0.5107   tst_loss:0.4182   tst_nll:0.1753   tst_kl:4.8581   sum_norm_grad:8.2919\n",
      "it: 7021   ms/it:1.8778   trn_loss:0.4387   tst_loss:0.4044   tst_nll:0.1686   tst_kl:4.7156   sum_norm_grad:7.9755\n",
      "it: 7255   ms/it:1.8988   trn_loss:0.5133   tst_loss:0.3726   tst_nll:0.1204   tst_kl:5.0447   sum_norm_grad:7.5885\n",
      "it: 7489   ms/it:1.9521   trn_loss:0.5418   tst_loss:0.3804   tst_nll:0.1413   tst_kl:4.7819   sum_norm_grad:9.0569\n",
      "it: 7723   ms/it:1.9067   trn_loss:0.4752   tst_loss:0.3914   tst_nll:0.1323   tst_kl:5.1816   sum_norm_grad:6.8096\n",
      "it: 7957   ms/it:1.9925   trn_loss:0.4323   tst_loss:0.3928   tst_nll:0.1711   tst_kl:4.4322   sum_norm_grad:4.3328\n",
      "it: 8191   ms/it:2.0536   trn_loss:0.4623   tst_loss:0.3915   tst_nll:0.1625   tst_kl:4.5813   sum_norm_grad:6.5804\n",
      "it: 8425   ms/it:1.9761   trn_loss:0.4686   tst_loss:0.4019   tst_nll:0.1885   tst_kl:4.2679   sum_norm_grad:10.3905\n",
      "it: 8659   ms/it:1.9916   trn_loss:0.4340   tst_loss:0.3946   tst_nll:0.1682   tst_kl:4.5282   sum_norm_grad:8.5048\n",
      "it: 8893   ms/it:1.9981   trn_loss:0.4335   tst_loss:0.3881   tst_nll:0.1704   tst_kl:4.3545   sum_norm_grad:5.8678\n",
      "it: 9127   ms/it:1.9771   trn_loss:0.4327   tst_loss:0.3541   tst_nll:0.1326   tst_kl:4.4309   sum_norm_grad:4.2285\n",
      "it: 9361   ms/it:2.1010   trn_loss:0.4541   tst_loss:0.3744   tst_nll:0.1422   tst_kl:4.6440   sum_norm_grad:6.0872\n",
      "it: 9595   ms/it:2.1687   trn_loss:0.4879   tst_loss:0.3705   tst_nll:0.1419   tst_kl:4.5713   sum_norm_grad:8.0271\n",
      "it: 9829   ms/it:2.1297   trn_loss:0.4340   tst_loss:0.3659   tst_nll:0.1262   tst_kl:4.7925   sum_norm_grad:4.3710\n",
      "it:10063   ms/it:1.9912   trn_loss:0.4504   tst_loss:0.3567   tst_nll:0.1261   tst_kl:4.6131   sum_norm_grad:9.4326\n",
      "it:10297   ms/it:1.9539   trn_loss:0.4492   tst_loss:0.3568   tst_nll:0.1328   tst_kl:4.4807   sum_norm_grad:5.5835\n",
      "it:10531   ms/it:1.9733   trn_loss:0.5599   tst_loss:0.3872   tst_nll:0.1688   tst_kl:4.3683   sum_norm_grad:9.9607\n",
      "it:10765   ms/it:1.9135   trn_loss:0.4590   tst_loss:0.3560   tst_nll:0.1185   tst_kl:4.7496   sum_norm_grad:7.2496\n",
      "it:10999   ms/it:1.9435   trn_loss:0.4926   tst_loss:0.3750   tst_nll:0.1588   tst_kl:4.3244   sum_norm_grad:9.7788\n",
      "it:11233   ms/it:1.9424   trn_loss:0.4168   tst_loss:0.3887   tst_nll:0.1521   tst_kl:4.7316   sum_norm_grad:6.4282\n",
      "it:11467   ms/it:1.9486   trn_loss:0.4855   tst_loss:0.3630   tst_nll:0.1365   tst_kl:4.5314   sum_norm_grad:6.8357\n",
      "it:11701   ms/it:1.9792   trn_loss:0.4255   tst_loss:0.3509   tst_nll:0.1415   tst_kl:4.1889   sum_norm_grad:8.1672\n",
      "it:11935   ms/it:2.0565   trn_loss:0.9048   tst_loss:0.3502   tst_nll:0.1108   tst_kl:4.7893   sum_norm_grad:17.4914\n",
      "it:12169   ms/it:1.9606   trn_loss:0.4105   tst_loss:0.3719   tst_nll:0.1567   tst_kl:4.3048   sum_norm_grad:7.8450\n",
      "it:12403   ms/it:1.9195   trn_loss:0.5903   tst_loss:0.3401   tst_nll:0.1140   tst_kl:4.5210   sum_norm_grad:14.9188\n",
      "it:12637   ms/it:1.8873   trn_loss:0.5405   tst_loss:0.3791   tst_nll:0.1601   tst_kl:4.3801   sum_norm_grad:9.0125\n",
      "it:12871   ms/it:1.9079   trn_loss:0.4144   tst_loss:0.3623   tst_nll:0.1552   tst_kl:4.1417   sum_norm_grad:7.9198\n",
      "it:13105   ms/it:1.9527   trn_loss:0.4402   tst_loss:0.3502   tst_nll:0.1365   tst_kl:4.2753   sum_norm_grad:7.6147\n",
      "it:13339   ms/it:1.9742   trn_loss:0.4194   tst_loss:0.3486   tst_nll:0.1009   tst_kl:4.9551   sum_norm_grad:9.2509\n",
      "it:13573   ms/it:1.9693   trn_loss:0.4537   tst_loss:0.3597   tst_nll:0.1215   tst_kl:4.7642   sum_norm_grad:9.9120\n",
      "it:13807   ms/it:1.9929   trn_loss:0.4179   tst_loss:0.3442   tst_nll:0.1229   tst_kl:4.4276   sum_norm_grad:7.1764\n",
      "it:14041   ms/it:2.1040   trn_loss:0.4295   tst_loss:0.3321   tst_nll:0.1044   tst_kl:4.5530   sum_norm_grad:6.1030\n",
      "it:14275   ms/it:2.0596   trn_loss:0.4154   tst_loss:0.3295   tst_nll:0.1003   tst_kl:4.5832   sum_norm_grad:2.8553\n",
      "it:14509   ms/it:2.0969   trn_loss:0.4184   tst_loss:0.3500   tst_nll:0.1244   tst_kl:4.5129   sum_norm_grad:5.8089\n",
      "it:14743   ms/it:2.0690   trn_loss:0.4793   tst_loss:0.3450   tst_nll:0.1234   tst_kl:4.4316   sum_norm_grad:9.5562\n",
      "it:14977   ms/it:2.0498   trn_loss:0.4134   tst_loss:0.3449   tst_nll:0.1132   tst_kl:4.6330   sum_norm_grad:7.9562\n",
      "it:15211   ms/it:2.0104   trn_loss:0.4901   tst_loss:0.3225   tst_nll:0.1064   tst_kl:4.3218   sum_norm_grad:10.7398\n",
      "it:15445   ms/it:2.0153   trn_loss:0.4784   tst_loss:0.3519   tst_nll:0.1349   tst_kl:4.3405   sum_norm_grad:9.7245\n",
      "it:15679   ms/it:2.0310   trn_loss:0.3431   tst_loss:0.3237   tst_nll:0.1082   tst_kl:4.3102   sum_norm_grad:4.9854\n",
      "it:15913   ms/it:1.9814   trn_loss:0.3959   tst_loss:0.3293   tst_nll:0.1034   tst_kl:4.5176   sum_norm_grad:3.0724\n",
      "it:16147   ms/it:2.0627   trn_loss:0.5097   tst_loss:0.3382   tst_nll:0.1116   tst_kl:4.5327   sum_norm_grad:10.6121\n",
      "it:16381   ms/it:2.1213   trn_loss:0.4401   tst_loss:0.3625   tst_nll:0.1481   tst_kl:4.2885   sum_norm_grad:8.5930\n",
      "it:16615   ms/it:2.0884   trn_loss:0.4569   tst_loss:0.3361   tst_nll:0.1037   tst_kl:4.6498   sum_norm_grad:8.3505\n",
      "it:16849   ms/it:2.1010   trn_loss:0.3757   tst_loss:0.3360   tst_nll:0.1131   tst_kl:4.4568   sum_norm_grad:4.9292\n",
      "it:17083   ms/it:1.9548   trn_loss:0.3774   tst_loss:0.3365   tst_nll:0.1294   tst_kl:4.1424   sum_norm_grad:5.1466\n",
      "it:17317   ms/it:1.9870   trn_loss:0.3638   tst_loss:0.3347   tst_nll:0.1163   tst_kl:4.3666   sum_norm_grad:7.1032\n",
      "it:17551   ms/it:1.9729   trn_loss:0.4665   tst_loss:0.3293   tst_nll:0.1112   tst_kl:4.3629   sum_norm_grad:10.1453\n",
      "it:17785   ms/it:1.9861   trn_loss:0.4739   tst_loss:0.3185   tst_nll:0.0894   tst_kl:4.5811   sum_norm_grad:9.4185\n",
      "it:18019   ms/it:2.0727   trn_loss:0.5350   tst_loss:0.3348   tst_nll:0.1270   tst_kl:4.1559   sum_norm_grad:15.3189\n",
      "it:18253   ms/it:2.0919   trn_loss:0.3890   tst_loss:0.3294   tst_nll:0.1010   tst_kl:4.5673   sum_norm_grad:5.5265\n",
      "it:18487   ms/it:2.0712   trn_loss:0.3504   tst_loss:0.3340   tst_nll:0.1233   tst_kl:4.2134   sum_norm_grad:3.2770\n",
      "it:18721   ms/it:1.9735   trn_loss:0.7267   tst_loss:0.3346   tst_nll:0.1066   tst_kl:4.5604   sum_norm_grad:15.6311\n",
      "it:18955   ms/it:2.0385   trn_loss:0.4850   tst_loss:0.3310   tst_nll:0.1166   tst_kl:4.2878   sum_norm_grad:12.0765\n",
      "it:19189   ms/it:2.0587   trn_loss:0.4337   tst_loss:0.3307   tst_nll:0.0906   tst_kl:4.8015   sum_norm_grad:6.5287\n",
      "it:19423   ms/it:1.9682   trn_loss:0.3695   tst_loss:0.3246   tst_nll:0.1148   tst_kl:4.1954   sum_norm_grad:7.4739\n",
      "it:19657   ms/it:1.9996   trn_loss:0.3982   tst_loss:0.3221   tst_nll:0.1014   tst_kl:4.4138   sum_norm_grad:7.1784\n",
      "it:19891   ms/it:1.9658   trn_loss:0.4141   tst_loss:0.3271   tst_nll:0.1146   tst_kl:4.2483   sum_norm_grad:4.7158\n",
      "it:20125   ms/it:2.0556   trn_loss:0.4565   tst_loss:0.3315   tst_nll:0.1079   tst_kl:4.4724   sum_norm_grad:9.7472\n",
      "it:20359   ms/it:2.0957   trn_loss:0.4421   tst_loss:0.3249   tst_nll:0.0941   tst_kl:4.6159   sum_norm_grad:7.1348\n",
      "it:20593   ms/it:2.1301   trn_loss:0.4268   tst_loss:0.3383   tst_nll:0.1172   tst_kl:4.4216   sum_norm_grad:5.0516\n",
      "it:20827   ms/it:2.1488   trn_loss:0.4111   tst_loss:0.3223   tst_nll:0.1087   tst_kl:4.2715   sum_norm_grad:7.2810\n",
      "it:21061   ms/it:2.0671   trn_loss:0.4297   tst_loss:0.3282   tst_nll:0.1211   tst_kl:4.1413   sum_norm_grad:7.6730\n",
      "it:21295   ms/it:2.1069   trn_loss:0.3883   tst_loss:0.3148   tst_nll:0.0962   tst_kl:4.3707   sum_norm_grad:4.0889\n",
      "it:21529   ms/it:2.1123   trn_loss:0.4523   tst_loss:0.3146   tst_nll:0.1020   tst_kl:4.2506   sum_norm_grad:9.0019\n",
      "it:21763   ms/it:2.0259   trn_loss:0.3251   tst_loss:0.3408   tst_nll:0.1331   tst_kl:4.1549   sum_norm_grad:3.0425\n",
      "it:21997   ms/it:2.0289   trn_loss:0.4182   tst_loss:0.3255   tst_nll:0.1191   tst_kl:4.1282   sum_norm_grad:13.4229\n",
      "it:22231   ms/it:2.0642   trn_loss:0.3769   tst_loss:0.3183   tst_nll:0.0942   tst_kl:4.4826   sum_norm_grad:4.3627\n",
      "it:22465   ms/it:1.9880   trn_loss:0.4083   tst_loss:0.3318   tst_nll:0.1125   tst_kl:4.3876   sum_norm_grad:8.9119\n",
      "it:22699   ms/it:2.0486   trn_loss:0.4075   tst_loss:0.3149   tst_nll:0.1035   tst_kl:4.2273   sum_norm_grad:9.2416\n",
      "it:22933   ms/it:2.0700   trn_loss:0.6194   tst_loss:0.3251   tst_nll:0.1209   tst_kl:4.0831   sum_norm_grad:14.2433\n",
      "it:23167   ms/it:2.0895   trn_loss:0.3624   tst_loss:0.3203   tst_nll:0.1111   tst_kl:4.1843   sum_norm_grad:5.3762\n",
      "it:23401   ms/it:2.1256   trn_loss:0.4200   tst_loss:0.3208   tst_nll:0.1137   tst_kl:4.1426   sum_norm_grad:7.3948\n",
      "it:23635   ms/it:2.0076   trn_loss:0.4218   tst_loss:0.3246   tst_nll:0.1141   tst_kl:4.2101   sum_norm_grad:9.3826\n",
      "it:23869   ms/it:2.0529   trn_loss:0.3513   tst_loss:0.3231   tst_nll:0.1158   tst_kl:4.1456   sum_norm_grad:6.5274\n",
      "it:24103   ms/it:1.9774   trn_loss:0.3698   tst_loss:0.3249   tst_nll:0.1131   tst_kl:4.2363   sum_norm_grad:3.5558\n",
      "it:24337   ms/it:1.9532   trn_loss:0.3951   tst_loss:0.3080   tst_nll:0.0846   tst_kl:4.4674   sum_norm_grad:6.9629\n",
      "it:24571   ms/it:1.9453   trn_loss:0.3477   tst_loss:0.3244   tst_nll:0.1142   tst_kl:4.2042   sum_norm_grad:3.3070\n",
      "it:24805   ms/it:1.9472   trn_loss:0.4807   tst_loss:0.3144   tst_nll:0.1007   tst_kl:4.2733   sum_norm_grad:12.1261\n",
      "it:25039   ms/it:1.9297   trn_loss:0.3501   tst_loss:0.3229   tst_nll:0.1098   tst_kl:4.2604   sum_norm_grad:4.8262\n",
      "it:25273   ms/it:1.9937   trn_loss:0.3407   tst_loss:0.3171   tst_nll:0.1183   tst_kl:3.9766   sum_norm_grad:3.6831\n",
      "it:25507   ms/it:2.0576   trn_loss:0.3658   tst_loss:0.3301   tst_nll:0.1313   tst_kl:3.9757   sum_norm_grad:9.4814\n",
      "it:25741   ms/it:2.0903   trn_loss:0.3454   tst_loss:0.3084   tst_nll:0.0869   tst_kl:4.4296   sum_norm_grad:3.8930\n",
      "it:25975   ms/it:1.9681   trn_loss:0.5474   tst_loss:0.3155   tst_nll:0.1113   tst_kl:4.0841   sum_norm_grad:13.9938\n",
      "it:26209   ms/it:1.9730   trn_loss:0.3537   tst_loss:0.3101   tst_nll:0.1051   tst_kl:4.0990   sum_norm_grad:7.3103\n",
      "it:26443   ms/it:1.9639   trn_loss:0.3909   tst_loss:0.3342   tst_nll:0.1349   tst_kl:3.9864   sum_norm_grad:8.8077\n",
      "it:26677   ms/it:1.9515   trn_loss:0.6007   tst_loss:0.3139   tst_nll:0.1028   tst_kl:4.2218   sum_norm_grad:14.1734\n",
      "it:26911   ms/it:1.9763   trn_loss:0.3362   tst_loss:0.3238   tst_nll:0.1199   tst_kl:4.0780   sum_norm_grad:2.8671\n",
      "it:27145   ms/it:2.0580   trn_loss:0.3860   tst_loss:0.3262   tst_nll:0.1228   tst_kl:4.0682   sum_norm_grad:7.2712\n",
      "it:27379   ms/it:2.0713   trn_loss:0.3619   tst_loss:0.3141   tst_nll:0.1113   tst_kl:4.0557   sum_norm_grad:3.7555\n",
      "it:27613   ms/it:1.9912   trn_loss:0.3931   tst_loss:0.3081   tst_nll:0.0844   tst_kl:4.4757   sum_norm_grad:4.9184\n",
      "it:27847   ms/it:2.0003   trn_loss:0.3528   tst_loss:0.3003   tst_nll:0.0825   tst_kl:4.3564   sum_norm_grad:3.5294\n",
      "it:28081   ms/it:1.9999   trn_loss:0.3667   tst_loss:0.3210   tst_nll:0.1091   tst_kl:4.2371   sum_norm_grad:4.0780\n",
      "it:28315   ms/it:1.9958   trn_loss:0.4151   tst_loss:0.3157   tst_nll:0.1091   tst_kl:4.1333   sum_norm_grad:8.0124\n",
      "it:28549   ms/it:1.9592   trn_loss:0.3867   tst_loss:0.3029   tst_nll:0.0771   tst_kl:4.5160   sum_norm_grad:6.2654\n",
      "it:28783   ms/it:1.9346   trn_loss:0.3660   tst_loss:0.3025   tst_nll:0.0969   tst_kl:4.1116   sum_norm_grad:5.3995\n",
      "it:29017   ms/it:1.9569   trn_loss:0.3517   tst_loss:0.3338   tst_nll:0.1289   tst_kl:4.0977   sum_norm_grad:4.6849\n",
      "it:29251   ms/it:1.9131   trn_loss:0.4085   tst_loss:0.3247   tst_nll:0.1175   tst_kl:4.1435   sum_norm_grad:9.0536\n",
      "it:29485   ms/it:1.9595   trn_loss:0.3752   tst_loss:0.3147   tst_nll:0.1122   tst_kl:4.0505   sum_norm_grad:4.7891\n",
      "it:29719   ms/it:1.9346   trn_loss:0.3727   tst_loss:0.3083   tst_nll:0.0964   tst_kl:4.2381   sum_norm_grad:6.7759\n",
      "it:29953   ms/it:2.0285   trn_loss:0.3990   tst_loss:0.3085   tst_nll:0.0953   tst_kl:4.2622   sum_norm_grad:7.3109\n",
      "it:30187   ms/it:1.9758   trn_loss:0.3465   tst_loss:0.3055   tst_nll:0.0979   tst_kl:4.1509   sum_norm_grad:2.8357\n",
      "it:30421   ms/it:1.9056   trn_loss:0.3583   tst_loss:0.3100   tst_nll:0.1061   tst_kl:4.0766   sum_norm_grad:4.7825\n",
      "it:30655   ms/it:1.8991   trn_loss:0.3609   tst_loss:0.3078   tst_nll:0.1008   tst_kl:4.1389   sum_norm_grad:4.8327\n",
      "it:30889   ms/it:1.9618   trn_loss:0.3803   tst_loss:0.3030   tst_nll:0.0885   tst_kl:4.2900   sum_norm_grad:5.8705\n",
      "it:31123   ms/it:1.9961   trn_loss:0.3822   tst_loss:0.3060   tst_nll:0.0986   tst_kl:4.1475   sum_norm_grad:6.3708\n",
      "it:31357   ms/it:2.0221   trn_loss:0.3590   tst_loss:0.3049   tst_nll:0.0973   tst_kl:4.1510   sum_norm_grad:6.3759\n",
      "it:31591   ms/it:2.0693   trn_loss:0.3420   tst_loss:0.3239   tst_nll:0.1013   tst_kl:4.4518   sum_norm_grad:3.3461\n",
      "it:31825   ms/it:2.0284   trn_loss:0.4415   tst_loss:0.3072   tst_nll:0.0897   tst_kl:4.3499   sum_norm_grad:9.5457\n",
      "it:32059   ms/it:2.0904   trn_loss:0.3310   tst_loss:0.3235   tst_nll:0.1210   tst_kl:4.0506   sum_norm_grad:4.4962\n",
      "it:32293   ms/it:2.0523   trn_loss:0.3475   tst_loss:0.3073   tst_nll:0.0976   tst_kl:4.1942   sum_norm_grad:2.9907\n",
      "it:32527   ms/it:2.0279   trn_loss:0.3822   tst_loss:0.3030   tst_nll:0.0885   tst_kl:4.2909   sum_norm_grad:6.4391\n",
      "it:32761   ms/it:2.1237   trn_loss:0.3487   tst_loss:0.2980   tst_nll:0.0892   tst_kl:4.1751   sum_norm_grad:4.0340\n",
      "it:32995   ms/it:2.0325   trn_loss:0.3242   tst_loss:0.3046   tst_nll:0.0942   tst_kl:4.2068   sum_norm_grad:3.3843\n",
      "it:33229   ms/it:2.1112   trn_loss:0.3349   tst_loss:0.2955   tst_nll:0.0929   tst_kl:4.0524   sum_norm_grad:5.4820\n",
      "it:33463   ms/it:2.0662   trn_loss:0.3708   tst_loss:0.3049   tst_nll:0.0964   tst_kl:4.1704   sum_norm_grad:6.5565\n",
      "it:33697   ms/it:2.0295   trn_loss:0.3910   tst_loss:0.3141   tst_nll:0.1185   tst_kl:3.9124   sum_norm_grad:5.9624\n",
      "it:33931   ms/it:2.1063   trn_loss:0.3667   tst_loss:0.3074   tst_nll:0.1012   tst_kl:4.1236   sum_norm_grad:7.7475\n",
      "it:34165   ms/it:2.0386   trn_loss:0.3843   tst_loss:0.3068   tst_nll:0.1036   tst_kl:4.0647   sum_norm_grad:6.2470\n",
      "it:34399   ms/it:2.0712   trn_loss:0.3196   tst_loss:0.3183   tst_nll:0.1044   tst_kl:4.2791   sum_norm_grad:2.4702\n",
      "it:34633   ms/it:1.9954   trn_loss:0.4186   tst_loss:0.2918   tst_nll:0.0850   tst_kl:4.1355   sum_norm_grad:11.2958\n",
      "it:34867   ms/it:2.0290   trn_loss:0.3490   tst_loss:0.3103   tst_nll:0.1054   tst_kl:4.0978   sum_norm_grad:4.6524\n",
      "it:35101   ms/it:2.0491   trn_loss:0.3254   tst_loss:0.3236   tst_nll:0.1347   tst_kl:3.7779   sum_norm_grad:2.4251\n",
      "it:35335   ms/it:2.0614   trn_loss:0.4333   tst_loss:0.3064   tst_nll:0.0928   tst_kl:4.2723   sum_norm_grad:15.8115\n",
      "it:35569   ms/it:2.0692   trn_loss:0.3628   tst_loss:0.3102   tst_nll:0.1123   tst_kl:3.9575   sum_norm_grad:5.2651\n",
      "it:35803   ms/it:2.0196   trn_loss:0.4141   tst_loss:0.3014   tst_nll:0.0861   tst_kl:4.3049   sum_norm_grad:7.4971\n",
      "it:36037   ms/it:2.0879   trn_loss:0.3861   tst_loss:0.3149   tst_nll:0.1040   tst_kl:4.2179   sum_norm_grad:7.1164\n",
      "it:36271   ms/it:2.0546   trn_loss:0.3436   tst_loss:0.3121   tst_nll:0.1148   tst_kl:3.9463   sum_norm_grad:2.8987\n",
      "it:36505   ms/it:2.0313   trn_loss:0.4668   tst_loss:0.2996   tst_nll:0.0929   tst_kl:4.1330   sum_norm_grad:11.8821\n",
      "it:36739   ms/it:1.9949   trn_loss:0.3284   tst_loss:0.3236   tst_nll:0.1262   tst_kl:3.9475   sum_norm_grad:3.9522\n",
      "it:36973   ms/it:2.0319   trn_loss:0.4026   tst_loss:0.3093   tst_nll:0.0988   tst_kl:4.2098   sum_norm_grad:12.1101\n",
      "it:37207   ms/it:2.0001   trn_loss:0.3315   tst_loss:0.3223   tst_nll:0.1218   tst_kl:4.0097   sum_norm_grad:2.7307\n",
      "it:37441   ms/it:1.9650   trn_loss:0.4421   tst_loss:0.3109   tst_nll:0.0940   tst_kl:4.3375   sum_norm_grad:8.6157\n",
      "it:37675   ms/it:2.0528   trn_loss:0.3616   tst_loss:0.2983   tst_nll:0.0928   tst_kl:4.1100   sum_norm_grad:12.3748\n",
      "it:37909   ms/it:2.0344   trn_loss:0.3869   tst_loss:0.2949   tst_nll:0.0938   tst_kl:4.0207   sum_norm_grad:6.6917\n",
      "it:38143   ms/it:1.9725   trn_loss:0.3351   tst_loss:0.3060   tst_nll:0.0925   tst_kl:4.2701   sum_norm_grad:3.3357\n",
      "it:38377   ms/it:1.9798   trn_loss:0.3290   tst_loss:0.3083   tst_nll:0.1192   tst_kl:3.7826   sum_norm_grad:5.5441\n",
      "it:38611   ms/it:1.9754   trn_loss:0.4292   tst_loss:0.3134   tst_nll:0.1180   tst_kl:3.9093   sum_norm_grad:10.6579\n",
      "it:38845   ms/it:2.0106   trn_loss:0.4040   tst_loss:0.2904   tst_nll:0.0897   tst_kl:4.0145   sum_norm_grad:6.2913\n",
      "it:39079   ms/it:1.9976   trn_loss:0.3487   tst_loss:0.3186   tst_nll:0.1229   tst_kl:3.9149   sum_norm_grad:7.3521\n",
      "it:39313   ms/it:2.0086   trn_loss:0.3488   tst_loss:0.3006   tst_nll:0.0960   tst_kl:4.0906   sum_norm_grad:3.8146\n",
      "it:39547   ms/it:2.0086   trn_loss:0.3602   tst_loss:0.3044   tst_nll:0.1013   tst_kl:4.0610   sum_norm_grad:4.1065\n",
      "it:39781   ms/it:2.0482   trn_loss:0.4210   tst_loss:0.2894   tst_nll:0.0878   tst_kl:4.0334   sum_norm_grad:7.2917\n",
      "it:40015   ms/it:2.0252   trn_loss:0.3613   tst_loss:0.2999   tst_nll:0.0974   tst_kl:4.0500   sum_norm_grad:4.0550\n",
      "it:40249   ms/it:2.0063   trn_loss:0.3924   tst_loss:0.3005   tst_nll:0.1033   tst_kl:3.9432   sum_norm_grad:5.7406\n",
      "it:40483   ms/it:2.0391   trn_loss:0.3393   tst_loss:0.2997   tst_nll:0.0997   tst_kl:4.0006   sum_norm_grad:5.3864\n",
      "it:40717   ms/it:2.0076   trn_loss:0.4238   tst_loss:0.2982   tst_nll:0.0857   tst_kl:4.2494   sum_norm_grad:13.8314\n",
      "it:40951   ms/it:2.0627   trn_loss:0.2797   tst_loss:0.3108   tst_nll:0.1172   tst_kl:3.8734   sum_norm_grad:2.4416\n",
      "it:41185   ms/it:2.0867   trn_loss:0.3180   tst_loss:0.3058   tst_nll:0.1108   tst_kl:3.8987   sum_norm_grad:2.5621\n",
      "it:41419   ms/it:2.0742   trn_loss:0.4763   tst_loss:0.3105   tst_nll:0.1105   tst_kl:4.0001   sum_norm_grad:9.6593\n",
      "it:41653   ms/it:2.0275   trn_loss:0.3460   tst_loss:0.3154   tst_nll:0.1242   tst_kl:3.8240   sum_norm_grad:8.2430\n",
      "it:41887   ms/it:2.0529   trn_loss:0.3495   tst_loss:0.2947   tst_nll:0.0951   tst_kl:3.9915   sum_norm_grad:6.4585\n",
      "it:42121   ms/it:2.0405   trn_loss:0.3794   tst_loss:0.3076   tst_nll:0.1091   tst_kl:3.9698   sum_norm_grad:8.3901\n",
      "it:42355   ms/it:2.0599   trn_loss:0.3690   tst_loss:0.3099   tst_nll:0.1064   tst_kl:4.0709   sum_norm_grad:5.9114\n",
      "it:42589   ms/it:2.0279   trn_loss:0.3238   tst_loss:0.2942   tst_nll:0.0702   tst_kl:4.4802   sum_norm_grad:3.2264\n",
      "it:42823   ms/it:2.0444   trn_loss:0.3442   tst_loss:0.3001   tst_nll:0.1081   tst_kl:3.8386   sum_norm_grad:5.5690\n",
      "it:43057   ms/it:2.0192   trn_loss:0.3318   tst_loss:0.3118   tst_nll:0.1116   tst_kl:4.0026   sum_norm_grad:3.2110\n",
      "it:43291   ms/it:1.9677   trn_loss:0.3935   tst_loss:0.3002   tst_nll:0.1001   tst_kl:4.0032   sum_norm_grad:11.5776\n",
      "it:43525   ms/it:1.9658   trn_loss:0.3071   tst_loss:0.3102   tst_nll:0.1131   tst_kl:3.9408   sum_norm_grad:4.3626\n",
      "it:43759   ms/it:1.9620   trn_loss:0.3644   tst_loss:0.2980   tst_nll:0.0992   tst_kl:3.9754   sum_norm_grad:5.5277\n",
      "it:43993   ms/it:1.9328   trn_loss:0.3614   tst_loss:0.3072   tst_nll:0.1156   tst_kl:3.8331   sum_norm_grad:7.3897\n",
      "it:44227   ms/it:1.9292   trn_loss:0.3308   tst_loss:0.2909   tst_nll:0.0970   tst_kl:3.8780   sum_norm_grad:2.4891\n",
      "it:44461   ms/it:1.9642   trn_loss:0.4045   tst_loss:0.2893   tst_nll:0.0951   tst_kl:3.8827   sum_norm_grad:7.6299\n",
      "it:44695   ms/it:1.9854   trn_loss:0.3186   tst_loss:0.3050   tst_nll:0.1065   tst_kl:3.9710   sum_norm_grad:3.9649\n",
      "it:44929   ms/it:2.0799   trn_loss:0.3767   tst_loss:0.3039   tst_nll:0.1033   tst_kl:4.0110   sum_norm_grad:8.9531\n",
      "it:45163   ms/it:2.0373   trn_loss:0.3146   tst_loss:0.2952   tst_nll:0.0945   tst_kl:4.0136   sum_norm_grad:2.7310\n",
      "it:45397   ms/it:2.0647   trn_loss:0.3301   tst_loss:0.2869   tst_nll:0.0841   tst_kl:4.0547   sum_norm_grad:4.1736\n",
      "it:45631   ms/it:2.1135   trn_loss:0.3127   tst_loss:0.3072   tst_nll:0.1161   tst_kl:3.8221   sum_norm_grad:2.9071\n",
      "it:45865   ms/it:2.0044   trn_loss:0.3673   tst_loss:0.3104   tst_nll:0.1286   tst_kl:3.6354   sum_norm_grad:10.2989\n",
      "it:46099   ms/it:2.0737   trn_loss:0.3188   tst_loss:0.3074   tst_nll:0.1103   tst_kl:3.9426   sum_norm_grad:2.2955\n",
      "it:46333   ms/it:1.9900   trn_loss:0.2997   tst_loss:0.3047   tst_nll:0.1083   tst_kl:3.9283   sum_norm_grad:3.3990\n",
      "it:46567   ms/it:1.9837   trn_loss:0.3438   tst_loss:0.3015   tst_nll:0.0958   tst_kl:4.1142   sum_norm_grad:8.2752\n",
      "it:46801   ms/it:1.9785   trn_loss:0.3467   tst_loss:0.3049   tst_nll:0.1095   tst_kl:3.9077   sum_norm_grad:2.6538\n",
      "it:46875   ms/it:2.0126   trn_loss:0.3597   tst_loss:0.2929   tst_nll:0.0980   tst_kl:3.8981   sum_norm_grad:4.1507\n"
     ]
    }
   ],
   "source": [
    "num_train_epochs = 25.  # @param { isTemplate: true}\n",
    "num_evals = 200        # @param { isTemplate: true}\n",
    "\n",
    "dur_sec = dur_num = 0\n",
    "num_train_steps = int(num_train_epochs * train_size // batch_size)\n",
    "for i in range(num_train_steps):\n",
    "  start = time.time()\n",
    "  trn_loss, (trn_nll, trn_kl), g = fit()\n",
    "  stop = time.time()\n",
    "  dur_sec += stop - start\n",
    "  dur_num += 1\n",
    "  if i % int(num_train_steps / num_evals) == 0 or i == num_train_steps - 1:\n",
    "    tst_loss, (tst_nll, tst_kl) = eval()\n",
    "    f, x = zip(*[\n",
    "        ('it:{:5}', opt.iterations),\n",
    "        ('ms/it:{:6.4f}', dur_sec / max(1., dur_num) * 1000.),\n",
    "        ('trn_loss:{:6.4f}', trn_loss),\n",
    "        ('tst_loss:{:6.4f}', tst_loss),\n",
    "        ('tst_nll:{:6.4f}', tst_nll),\n",
    "        ('tst_kl:{:6.4f}', tst_kl),\n",
    "        ('sum_norm_grad:{:6.4f}', sum(g)),\n",
    "\n",
    "    ])\n",
    "    print('   '.join(f).format(*[getattr(x_, 'numpy', lambda: x_)()\n",
    "                                 for x_ in x]))\n",
    "    sys.stdout.flush()\n",
    "    dur_sec = dur_num = 0\n",
    "  # if i % 1000 == 0 or i == maxiter - 1:\n",
    "  #   encoder.save('/tmp/encoder.npz')\n",
    "  #   decoder.save('/tmp/decoder.npz')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "G1ImqkK7xAv1"
   },
   "source": [
    "### 6  Evaluate Classification Accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "Fg2mxVJPsSOQ"
   },
   "outputs": [],
   "source": [
    "def evaluate_accuracy(dataset, encoder, decoder):\n",
    "  \"\"\"Evaluate the accuracy of your model on a dataset.\n",
    "  \"\"\"\n",
    "  this_it = iter(dataset)\n",
    "  num_correct = 0\n",
    "  num_total = 0\n",
    "  attempts = 0\n",
    "  for xin, xout in this_it:\n",
    "    xin, xout = next(this_it)\n",
    "    e = encoder(xin)\n",
    "    z = e.sample(10000)  # 10K samples should have low variance.\n",
    "    d = decoder(z)\n",
    "    yhat = d.sample()\n",
    "    confidence = tf.reduce_mean(d.probs_parameter(), axis=0)\n",
    "    most_likely = tf.cast(tf.math.argmax(confidence, axis=-1), tf.int32)\n",
    "    num_correct += np.sum(most_likely == xout, axis=0)\n",
    "    num_total += xout.shape[0]\n",
    "    attempts +=1\n",
    "  return num_correct, num_total"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 35
    },
    "colab_type": "code",
    "id": "8fZiEgQJuoMW",
    "outputId": "f9624596-07f9-4f35-a63f-9178ec36bf8b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy:  0.9930\n"
     ]
    }
   ],
   "source": [
    "nc, nt = evaluate_accuracy(eval_dataset.batch(100), encoder, decoder)\n",
    "print(\"Accuracy:  %.4f\"%(nc/nt))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "lyyh37u80SNT"
   },
   "source": [
    "The accuracy of one training run with this particular model and training setup was 99.15%, which is within a half of a percent of the state of the art, and comparable to the mnist accuracy reported in Alemi et al. (2016)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Y0A3I1IymUWT"
   },
   "source": [
    "# OOD detection using DoSE\n",
    "\n",
    "From the previous section, we have trained a variational classifier.  However, this classifier was trained assuming that all of the inputs are from the distribution which generated the training set.  In general, we may not always receive images drawn from this distribution.  In these situations, our model prediction is unreliable.  We want to be able to identify when this may be the case to avoid serving these flawed predictions.  \n",
    "\n",
    "In this section, we turn the VIB classifier into an OOD detector using DoSE."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "T6eHmdEjIeuL"
   },
   "source": [
    "### 1 Get statistics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "Z3QMQ-L3mTQJ"
   },
   "outputs": [],
   "source": [
    "def get_statistics(encoder, decoder, prior):\n",
    "  \"\"\"Setup a function to evaluate statistics given model components.\n",
    "  \n",
    "  Args:\n",
    "    encoder:  Callable neural network which takes in an image and \n",
    "      returns a tfp.distributions.Distribution object.\n",
    "    decoder: Callable neural network which takes in a vector and \n",
    "      returns a tfp.distributions.Distribution object.\n",
    "    prior:  A tfp.distributions.Distribution object which operates \n",
    "      on the same spaces as the encoder.\n",
    "  Returns:\n",
    "    T:  A function, which takes in a tensor containing an image (or \n",
    "      batch of images) and evaluates statistics on the model.  \n",
    "      Optionally it  also returns the prediction, under the assumption \n",
    "      that the DoSE model will only dress an actual classifier.\n",
    "  \"\"\"\n",
    "  def T(x, return_pred=False):\n",
    "    \"\"\"Evaluate statistics on an input image or batch of images.\n",
    "    \n",
    "    Given an input tensor `x` containing either an image or a batch of \n",
    "    images, this function evaluates 4 statistics on a VIB model;  the\n",
    "    kl-divergence between the posterior and prior, the expected entropy\n",
    "    of the decoder computed using samples from the posterior, the \n",
    "    posterior entopy, and the cross-entropy between the posterior and\n",
    "    the prior.  We also allow for the prediction to be optionally\n",
    "    returned.\n",
    "\n",
    "    Args: \n",
    "      x:  rank 4 tensor containing a batch of images\n",
    "      return_pred:  Bool indicating whether to return the model\n",
    "        prediction.\n",
    "    Returns:\n",
    "      tf.tensor containing the 4 statistics evaluated on the input.\n",
    "      pred (optional):  The prediction of the model.\n",
    "    \"\"\"\n",
    "    pzgx = encoder(x)\n",
    "    z = pzgx.sample(100, seed=42) # Seed is fixed for determinism.\n",
    "    pxgz = decoder(z)\n",
    "\n",
    "    kl = pzgx.kl_divergence(prior)[tf.newaxis,...]\n",
    "    dent = tf.reduce_mean(pxgz.entropy(), axis=0)[tf.newaxis,...]\n",
    "    eent = pzgx.entropy()[tf.newaxis,...]\n",
    "    xent = pzgx.cross_entropy(prior)[tf.newaxis,...]\n",
    "    if return_pred:\n",
    "      pred = tf.math.argmax(\n",
    "          tf.reduce_mean(pxgz.probs_parameter, axis=0), \n",
    "          axis=-1)\n",
    "      return tf.concat([kl, dent, eent, xent], axis=0), pred\n",
    "    else:\n",
    "      return tf.concat([kl, dent, eent, xent], axis=0)\n",
    "  return T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "nwVSy6J3JK46"
   },
   "outputs": [],
   "source": [
    "T = get_statistics(encoder, decoder, prior)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "n2szpmf2IymI"
   },
   "source": [
    "### 2 Define DoSE helper classes and functions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "KK0cmEgwoEGH"
   },
   "outputs": [],
   "source": [
    "def get_DoSE_KDE(T, dataset):\n",
    "  \"\"\"Get a distribution and decision rule for OOD detection using DoSE.\n",
    "\n",
    "  Given a tensor of statistics tx, compute a Kernel Density Estimate (KDE) of\n",
    "  the statistics.  This uses a quantiles trick to cut down the number of \n",
    "  samples used in the KDE (to lower the cost of evaluating a trial point).\n",
    "\n",
    "  Args:\n",
    "    T:  A function which takes an input image and returns a vector of\n",
    "      statistics evaluated using the model.\n",
    "    dataset:  A tensorflow_datasets `Dataset` which will be used to evaluate\n",
    "      statistics to construct the estimator.\n",
    "  Returns:\n",
    "    is_ood:  A function which takes a new point `x` and `threshold`, and \n",
    "      computes the decision rule KDE.log_prob(T(x)) < threshold\n",
    "    dose_kde:  A tfd.MixtureSameFamily object.  The distribution used as the KDE\n",
    "      from which the log_prob of a batch of statistics can be computed.\n",
    "  \"\"\"\n",
    "\n",
    "  # First we should evaluate the statistics on the training set.\n",
    "  it = iter(dataset)\n",
    "  for x, y in it:\n",
    "    if not \"tx\" in locals():\n",
    "      tx = T(x)\n",
    "    else:\n",
    "      tx = tf.concat([tx, T(x)], axis=-1)\n",
    "\n",
    "  n = tf.cast(tf.shape(tx)[-1], tx.dtype)\n",
    "  num_quantiles = int(25)\n",
    "  q = tfp.stats.quantiles(tx, num_quantiles, axis=-1)\n",
    "  q = tf.transpose(q, tf.roll(tf.range(tf.rank(q)), shift=-1, axis=0))\n",
    "  # Scott's Rule:\n",
    "  h = 3.49 * tf.math.reduce_std(tx, axis=-1, keepdims=True) * (n)**(-1./3.)\n",
    "  h *= n / num_quantiles\n",
    " \n",
    "  dose_kde = tfd.Independent(\n",
    "      tfd.MixtureSameFamily(\n",
    "          mixture_distribution=tfd.Categorical(logits=tf.zeros(num_quantiles + 1)),\n",
    "          components_distribution=tfd.Normal(loc=q, scale=h)),\n",
    "      reinterpreted_batch_ndims=1)\n",
    "  is_ood = lambda x, threshold: dose_kde.log_prob(tf.transpose(T(x), [1, 0])) < tf.math.log(threshold)\n",
    "  dose_log_prob = lambda x: dose_kde.log_prob(tf.transpose(T(x), [1, 0]))\n",
    "\n",
    "  # T(x) returns shape [T, N], but dose_kde works on shape [N, T]\n",
    "  return is_ood, dose_kde, dose_log_prob, tx\n",
    "\n",
    "\n",
    "class DoSE_administrator(object):\n",
    "  def __init__(self, T, train_dataset, eval_dataset):\n",
    "    \"\"\"Administrate DoSE for model evaluation in a more efficient way.\n",
    "\n",
    "    This high level object just calls the lower level DoSE methods, but\n",
    "    also evaluates the DoSE log-probabilities on the evaluation dataset.\n",
    "    Using these, we can do things like compute auroc much more efficiently.\n",
    "    \"\"\"\n",
    "    dose_build = get_DoSE_KDE(T, train_dataset)\n",
    "    \n",
    "    # Call DoSE on an image/batch x for lp threshold `threshold`\n",
    "    self.is_ood = dose_build[0]\n",
    "\n",
    "    # Actual dose distribution\n",
    "    self.dose_dist = dose_build[1]\n",
    "    self.dose_lp = lambda t: self.dose_dist.log_prob(tf.transpose(t, [1, 0]))\n",
    "\n",
    "    # Get the log-probability of a batch from dose\n",
    "    self.dose_log_prob = dose_build[2] \n",
    "\n",
    "    # This helps us evaluate auroc more reliably.\n",
    "    self.training_stats = dose_build[3]\n",
    "    \n",
    "    # Get training_log probs efficiently\n",
    "    train_size = self.training_stats.shape[-1]\n",
    "    bs = train_size // 1000\n",
    "    for i in range(1000):\n",
    "      tlp = self.dose_lp(self.training_stats[..., bs*i:bs*(i+1)])\n",
    "      if not hasattr(self, 'training_lp'):\n",
    "        self.training_lp = tlp\n",
    "      else:\n",
    "        self.training_lp = tf.concat([self.training_lp, tlp], axis=0)\n",
    "\n",
    "    # Get log_probs, images, labels, and statistics \n",
    "    # on the evaluation dataset.\n",
    "    eval_it = iter(eval_dataset)\n",
    "    for x, y in eval_it:\n",
    "      if not hasattr(self, 'eval_lp'):\n",
    "        self.eval_stats = T(x)\n",
    "        self.eval_lp = self.dose_lp(self.eval_stats)\n",
    "        self.eval_label = y\n",
    "        self.eval_ims = x\n",
    "      else:\n",
    "        tx = T(x)\n",
    "        self.eval_stats = tf.concat([self.eval_stats,\n",
    "                                     tx], \n",
    "                                    axis=0)\n",
    "        self.eval_lp = tf.concat([self.eval_lp,\n",
    "                                  self.dose_lp(tx)],\n",
    "                                 axis=0)\n",
    "        self.eval_label = tf.concat([self.eval_label, y], axis=0)\n",
    "        self.eval_ims = tf.concat([self.eval_ims, x], axis=0)\n",
    "\n",
    "  \n",
    "  def get_acc(self, threshold):\n",
    "    \"\"\"Evaluate the OOD accuracy for a certain threshold probability.\n",
    "    \n",
    "    This computes the decision rule: `log q(x) < tf.math.log(thresh)`\n",
    "    on the eval dataset.  It uses this decision rule to evaluate the\n",
    "    number of correct predictions, along with the 4 components of the\n",
    "    confusion matrix.\n",
    "\n",
    "    Args:\n",
    "      threshold:  A threshold on the DoSE probability density.\n",
    "    Returns:\n",
    "      nc:  Number of correct predictions\n",
    "      nt:  Number of total predictions\n",
    "      tp:  Number of true positives\n",
    "      tn:  Number of true negatives\n",
    "      fp:  Number of false positives\n",
    "      fn:  Number of false negatives\n",
    "    \"\"\"\n",
    "\n",
    "    yhat = self.eval_lp < tf.math.log(threshold)\n",
    "\n",
    "    fp = tf.reduce_sum(tf.cast(\n",
    "        tf.logical_and(tf.math.not_equal(yhat, self.eval_label), \n",
    "                       tf.equal(self.eval_label, False)),\n",
    "        tf.int32),axis=0)\n",
    "    fn = tf.reduce_sum(tf.cast(\n",
    "        tf.logical_and(tf.math.not_equal(yhat, self.eval_label), \n",
    "                       tf.equal(self.eval_label, True)),\n",
    "        tf.int32),axis=0)\n",
    "    tp = tf.reduce_sum(tf.cast(\n",
    "        tf.logical_and(tf.equal(yhat, self.eval_label), \n",
    "                       tf.equal(self.eval_label, True)),\n",
    "        tf.int32),axis=0)\n",
    "    tn = tf.reduce_sum(tf.cast(\n",
    "        tf.logical_and(tf.equal(yhat, self.eval_label), \n",
    "                       tf.equal(self.eval_label, False)),\n",
    "        tf.int32),axis=0)\n",
    "    nc = tp+tn\n",
    "    nt = tf.cast(tf.size(self.eval_label), tf.float32) \n",
    "    return nc, nt, tp, tn, fp, fn\n",
    "  \n",
    "  def roc_curve(self, nbins):\n",
    "    \"\"\"Get the roc curve for the model.\"\"\"\n",
    "\n",
    "    nc, nt, tp, tn, fp, fn = self.get_acc(\n",
    "        np.float32(np.exp(np.percentile(self.eval_lp, 0.))))\n",
    "    fpr = [fp.numpy() / (fp.numpy()+tn.numpy())]\n",
    "    tpr = [tp.numpy()/ (tp.numpy() + fn.numpy())]\n",
    "    for i in range(1, nbins+1):\n",
    "      nc, nt, tp, tn, fp, fn = self.get_acc(\n",
    "        np.float32(np.exp(np.percentile(self.eval_lp, i/float(nbins)*100.))))\n",
    "      fpr.append(fp.numpy()/ (fp.numpy() + tn.numpy()))\n",
    "      tpr.append(tp.numpy()/ (tp.numpy() + fn.numpy()))\n",
    "    return fpr, tpr\n",
    "\n",
    "  def precision_recall_curve(self, nbins):\n",
    "    \"\"\"Get the precision-recall curve for the model.\"\"\"\n",
    "\n",
    "    nc, nt, tp, tn, fp, fn = self.get_acc(\n",
    "        np.float32(np.exp(np.percentile(self.eval_lp, 0.))))\n",
    "    precision = [tp.numpy()/ (tp.numpy() + fp.numpy())]\n",
    "    recall = [tp.numpy() / (tp.numpy() + fn.numpy())]\n",
    "    for i in range(1, nbins+1):\n",
    "      nc, nt, tp, tn, fp, fn = self.get_acc(\n",
    "        np.float32(np.exp(np.percentile(self.eval_lp, i/float(nbins)*100.))))\n",
    "      precision.append(tp.numpy()/ (tp.numpy() + fp.numpy()))\n",
    "      recall.append(tp.numpy() / (tp.numpy() + fn.numpy()))\n",
    "    return precision, recall"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "jXozW6F4I9hy"
   },
   "source": [
    "### 3 Setup OOD dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "8ivxmHF4txD4"
   },
   "outputs": [],
   "source": [
    "# For evaluating statistics on the training set, we need to perform a\n",
    "# pass through the dataset.\n",
    "train_one_pass = tfds.load('mnist')['train']\n",
    "train_one_pass = tfn.util.tune_dataset(train_one_pass, \n",
    "                                       batch_size=1000,\n",
    "                                       repeat_count=None,\n",
    "                                       preprocess_fn=_preprocess)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "Xhcfu7UX8eC4"
   },
   "outputs": [],
   "source": [
    "# OOD dataset is Fashion_MNIST\n",
    "ood_data = tfds.load('fashion_mnist')['test'].map(_preprocess).map(\n",
    "    lambda x, y: (x, tf.ones_like(y, dtype=tf.bool)))\n",
    "\n",
    "# In-distribution data is the MNIST test set.\n",
    "ind_data = tfds.load('mnist')['test'].map(_preprocess).map(\n",
    "    lambda x, y: (x, tf.zeros_like(y, dtype=tf.bool)))\n",
    "\n",
    "# Our trial dataset is a 50-50 split of the two.\n",
    "hybrid_data = ind_data.concatenate(ood_data)\n",
    "hybrid_data = tfn.util.tune_dataset(hybrid_data, batch_size=100,\n",
    "                                    shuffle_size=20000,repeat_count=None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "oj7j-Z-SJXWv"
   },
   "source": [
    "### 4 Administer DoSE"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "Rp7837jIwvTV"
   },
   "outputs": [],
   "source": [
    "DoSE_admin = DoSE_administrator(T, train_one_pass, hybrid_data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "K9HhI88EJd8N"
   },
   "source": [
    "### 5 Evaluate OOD performance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 409
    },
    "colab_type": "code",
    "id": "MjWjlZOBok5z",
    "outputId": "9a502caf-992f-42ab-a90e-3c7f2b2fcd22"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/export/hda3/borglet/remote_hdd_fs_dirs/0.colab_kernel_brain_frameworks_gpu_wmorning.kernel.wmorning.579822584826.14b334fb3717c109/mount/server/ml_notebook:162: RuntimeWarning: invalid value encountered in int_scalars\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'AUPRC: 0.9896')"
      ]
     },
     "execution_count": 0,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmwAAAFQCAYAAAACxSJuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xl0VPX9//HXJGHJTghrSFgjiJGI\nEijgAlotSwuloBiEKqJEBI+KP1rtoi1Uj2C/1lqxpVGksonbUY5oQFQWt4IRAQGRLSwJCIQ9CSQw\n+fz+uM3IkG0gmZk7M8/HOXMmM/fOzfsDmXde+dx75zqMMUYAAACwrTB/FwAAAICaEdgAAABsjsAG\nAABgcwQ2AAAAmyOwAQAA2ByBDQAAwOYIbAAAADZHYINL//79lZCQoNLS0krPv/zyy27PrVy5UsnJ\nya7HDodD0dHRiomJUZs2bfTII4/I6XS6vWbJkiXq1auXoqOjlZiYqNGjRys/P99tnQMHDuiee+5R\n69atFRsbq8svv1x/+tOfVFxc7NEY1q9frx49eigqKko9evTQ+vXrq123oKBAv/zlL9W0aVMlJydr\n1qxZbss/+eQTXXPNNYqLi1PHjh2VnZ3tWlZaWqrJkycrKSlJCQkJmjhxos6ePetavnv3bg0ePFgJ\nCQlq1aqVHnjgAZ07d86jMQC4NN7qYe3bt1dkZKRiYmLUqlUrjR07VkVFRW7bW7t2rQYPHqwmTZqo\nadOm6tWrl+bMmeNx7QsXLlS7du0UHR2tYcOG6ejRo9Wu+8UXX6hXr16KjY1Venq6PvvsM7flL7zw\ngjp06KC4uDhlZGS4La+t7zmdTv3xj39UUlKSYmNjdfXVV+v48eMejwNeZABjTF5engkLCzMJCQnm\njTfecFvWr18/89JLL7k9t2LFCtOmTRvXY0lm+/btxhhjtm/fbpKSkkx2drZr+ZtvvmliY2PN/Pnz\nTUlJiTlw4IC5++67Tbt27czRo0eNMcYcOXLEtGvXzowaNcrk5eUZY4zZu3evefDBB82GDRtqHUNp\naalp27at+dvf/mbOnDljnn/+edO2bVtTWlpa5fr9+/c3Dz30kCkrKzPr1683CQkJ5pNPPjHGGFNW\nVmbi4uLMrFmzTHl5uVm7dq2Jjo4269evN8YY8+c//9lcd9115siRI+bQoUPmJz/5iXniiSdc2x40\naJC56667zOnTp82BAwfMlVdeaZ5//vlaxwDg0tRnD/vuu+9My5Ytzb/+9S9jjDHt2rUzy5cvN8YY\nc+DAAZOenm5+//vfu177xRdfmOjoaDN9+nRz+PBhU15ebnJzc81tt93mUe2bNm0yMTExZtWqVebU\nqVNm1KhR5vbbb69y3SNHjpjExETzxhtvmHPnzpl58+aZJk2auProf//7XxMVFWVyc3NNeXm5+ec/\n/2maNWtmzp07Z4ypue8ZY8wf/vAHc+ONN5rdu3eb8vJy8+2335rTp097NA54F4ENxhhjpk6davr2\n7WsmT55sfv7zn7stu9hmZ4wxt912m5k4caIxxpjy8nLTtm1bM2PGDLdtOJ1Ok5aWZh5//HFjjNUo\nrrzySuN0Oi9pDMuWLTNJSUmmvLzc9VxKSorJycmptO6pU6eMJHPo0CHXc+PHjzdjxowxxhjzww8/\nGEmmuLjYtTwjI8MsXLjQGGNMjx493H4pLFiwwCQnJ7seX3755eb99993PZ4yZYrJysq6pHEBqF19\n97Bbb73VTJo0yRjjHtiMMeY3v/mNGTx4sOvxtdde6+p3l+J3v/udGTVqlOvxjh07TIMGDczJkycr\nrfvee++ZK664wu25yy67zLz88svGGGMWLVpkevbs6VpWVFRkJJn9+/fX2veOHj1qoqOjzY4dOy55\nLPAedolCkjR37lyNHj1ao0eP1rJly3Tw4MFL3tbWrVv16aefKjU1VZL0/fffa+/evbrtttvc1gsL\nC9OIESO0fPlySdJHH32k4cOHKyys+h/LX/ziF5o+fXqVyzZv3qz09HQ5HA7Xc+np6dq8eXOldc3/\nrshmzrsymzFGmzZtkiS1bNlSo0aN0pw5c+R0OvXll19qz549uu6661zrXvja/Px8nThxQpL00EMP\nadGiRSopKVFBQYFycnI0cODAascFoG7qs4dt2bJFn376qa6++upKy/Lz85WTk+PqbyUlJfryyy91\n66231rjNJk2aVNp1WWHz5s266qqrXI87deqkhg0batu2bZXWvbD3VDxX0bsGDRokp9OpNWvWyOl0\n6pVXXlH37t3VqlWrWvvet99+q4iICL311ltq1aqVOnfurBdffLHGccF3CGzQZ599pj179mjkyJHq\n0aOHOnXqpIULF170dq655hpFR0era9eu6t+/vyZOnChJKiwslCS1bt260mtat27tWn7kyJEq1znf\nkiVL9Nhjj1W5rKioSPHx8W7PxcfH69SpU5XWjY2N1bXXXqu//OUvOnPmjNatW6e3335bJSUlrnVG\njRqladOmqVGjRrr++uv11FNPKSUlRZLVFJ9//nkdPnxYP/zwg/7xj39Ikuv1/fr10+bNmxUXF6fk\n5GRlZGRo2LBhNY4NwKWpzx6WkJCgIUOG6N5779Xdd9/tWjZs2DDFxsYqJSVFLVq00NSpUyVJx44d\nU3l5ea296/jx464/+C50Mb2rb9++2r9/v1577TWdPXtWr776qnbu3OnqPbGxsRoxYoSuu+46NWrU\nSFOnTlV2drYcDketfa/ij85t27YpLy9Pb731lv785z+7/qiGfxHYoFdffVU/+9nP1KxZM0nSHXfc\noVdffdW1PCIiwu2Aekk6e/asGjRo4PbcunXrVFRUpNdff11r1qxxnShQsd0DBw5U+t4HDhxwLU9M\nTKxyHU/FxMTo5MmTbs+dPHlSsbGxVa6/YMEC5eXlKSUlRffff79Gjx7tOgh569atuv322zV37lyV\nlZVp8+bNeuaZZ/T+++9Lkv7whz/o6quvVvfu3dW3b18NGzZMDRo0UIsWLVReXq4BAwZo+PDhKi4u\nVmFhoY4dO6ZHH330kscGoHr12cOOHTumnTt36sknn3Sb7X/33Xd16tQprVy5Ulu3bnX9oZmQkKCw\nsDCf9a7ExEQtXrxYf/vb39SyZUstXbpUN998s6t3vfzyy3rllVe0efNmlZWVaf78+frFL36h/fv3\nS6q570VGRkqSnnjiCUVGRio9PV2ZmZn64IMPLnlsqD8EthB3+vRpvfHGG1q1apVatWqlVq1a6bnn\nntOGDRu0YcMGSVLbtm21e/dut9fl5eWpXbt2lbbncDg0cuRI9enTR9OmTZMkdenSRcnJyXrzzTfd\n1i0vL9fbb7+tn/70p5Kkm2++We+8847Ky8svaSxpaWnauHGj23T/xo0blZaWVuX67dq105IlS3T4\n8GGtWbNGR44cUa9evSRJmzZtUpcuXTRgwACFhYWpS5cu+vnPf66cnBxJVmObOXOmCgoKtGvXLiUm\nJqpHjx4KDw/X0aNHtW/fPj3wwANq1KiREhMTdffdd9P0AC+o7x5Wm379+mns2LGaMmWKJCkqKkp9\n+vTR22+/fcljSEtLc9UqSbt27VJpaak6d+5cbQ1fffWVjh49qnnz5un777939a4NGzZoyJAh6ty5\ns8LCwjRw4EC1bt1aX3zxhaSa+156erokuR1WAhvxy5FzsI2FCxeahIQEs2fPHnPgwAHX7frrrzeP\nPPKIMcaYpUuXmubNm5s1a9aY8vJy8/3335vLL7/cdQaVMZUP2N24caOJjIw0Bw4cMMZYB8LGxsaa\nBQsWuJ0lmpKSYgoLC40xP54lOmbMGLN7925jjDH5+flm8uTJF3WW6N///ndz5swZ88ILL9R4luiW\nLVvMyZMnTWlpqZk3b55JTEx0HYy7Y8cOEx0dbT7++GNTXl5uduzYYTp16uQ68zU/P98UFBSY8vJy\n8+WXX5rk5GSzbNky17Y7dOhgnn76aXP27Flz7NgxM2zYMHPHHXd4/P8CwDPe6mHnu/Ckg0OHDpmo\nqCjzzTffGGOM+fzzz010dLR55plnXP1s/fr11Z7peaFNmzaZ2NhYs3r1alNUVGRGjx5d42vXrVtn\nysrKzIkTJ8xDDz1k+vbt61r2n//8x1x22WVm586dpry83Hz44YcmMjLSfPfdd8aYmvueMcZcf/31\nJisry5w5c8Zs2bLFNG/e3Hz00UcejQPeRWALcQMGDHA1tfO9/vrrpmXLlubs2bPGGGNmz55trrji\nChMbG2s6depknn76abezOatqdgMHDnTb9rvvvmsyMjJMVFSUSUhIMJmZmWbv3r1urykoKDB33323\nadmypYmJiTFdunQxf/7zn11naw4cONA89dRT1Y5n3bp15pprrjGNGzc2V199tVm3bp1r2fz5893O\nrnruuedMs2bNTFRUlLn22mvNV199VenfIC0tzcTExJg2bdqY3/72t64xr1q1yrRr185ERkaazp07\nm/nz57u99ptvvjH9+vUzTZo0MYmJiebWW281Bw8erLZuAJfGmz2swoWBzRhjJkyYYIYPH+56vGbN\nGjNw4EATFxdnEhISTK9evcyrr77qWh4dHW1Wr15d7TgWLFhgUlJSTFRUlBk6dKg5cuSIa9l9991n\n7rvvPtfjzMxMExcXZ+Li4szIkSPdekt5ebl5/PHHTUpKiomJiTGXX365mTt3rmt5bX0vPz/fDBgw\nwERHR5sOHTqYWbNmVVszfMthzAWnmwAAAMBWOIYNAADA5nwS2MaNG6cWLVroyiuvrHK5MUYPPvig\nUlNTlZ6ernXr1vmiLADwCD0MgL/5JLCNHTtWS5curXZ5Tk6Otm/fru3btys7O1v333+/L8oCAI/Q\n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\n5QAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {
      "tags": []
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fp, tp = DoSE_admin.roc_curve(10000)\n",
    "precision, recall = DoSE_admin.precision_recall_curve(10000)\n",
    "plt.figure(figsize=[10,5])\n",
    "plt.subplot(121)\n",
    "plt.plot(fp, tp, 'b-')\n",
    "plt.xlim(0, 1.)\n",
    "plt.ylim(0., 1.)\n",
    "plt.xlabel('FPR', fontsize=12)\n",
    "plt.ylabel('TPR', fontsize=12)\n",
    "plt.title(\"AUROC: %.4f\"%np.trapz(tp, fp), fontsize=12)\n",
    "plt.subplot(122)\n",
    "plt.plot(recall, precision, 'b-')\n",
    "plt.xlim(0, 1.)\n",
    "plt.ylim(0., 1.)\n",
    "plt.xlabel('Recall', fontsize=12)\n",
    "plt.ylabel('Precision', fontsize=12)\n",
    "plt.title(\"AUPRC: %.4f\"%np.trapz(precision[1:], recall[1:]), fontsize=12)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 321
    },
    "colab_type": "code",
    "id": "NXftuKHAjcib",
    "outputId": "32136743-138e-4696-8e26-25a9d582ee3c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Most False Positive\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nP8ccc6S1HXbYQRIhL2jL1QmxUsxhpP/85z/T2sMPP1zN3aqJWJ269957S8p3W80+++xtvsbVGiec\ncEJa8zHn+++/r8h+Vsumm24qSTruuOPS2jLLLCNJ+uabb2qyT7U2dOjQtL3aaqtJylep+pzWUXWp\nK2/jY649rnCMX1tt3tcLLrggrW222Wbj/PxCFczlUk8VzL5O9bk3rsXnybHHHispC5OK4mPokEMO\nkZS/NjSfy6XG6SKInVOPP/64pPzzo1DA95NPPikpO97EtfiYa8Tgvw033FCS9NBDD6W1b7/9ts3n\nuYo1hrvttttukqTZZpstrblyOVbQX3HFFeXb4ToTH0/2xBNPtFlzV8Cqq67a5mMxlPfjjz+WlH99\nVuj7VdPw4cPTtrtczj333LS26667lvy9l1hiCUlZR7mUVffG10l//etfJUlffPFFyT+rntxxxx1p\n213Up5xySlpzl1kjVduWw5JLLpm2HVrt+yxSdnx2h7qUXRPG15lecyC4JG2yySaS8l079Sh2Zfmc\n7e5OKTs3uZJZykJ7x4wZU/H9I+QPAAAAAAAAAFBW3GAGAAAAAAAAAJSkJUL+ZpppJkn5Vp6FFlqo\nzee98847krJWBCkbmt2IgRUov3nmmSdtX3XVVW3WCvn5558ruk+d9dxzz43zY3GETLlbq90KVShk\nqB4ssMACkrLWR0madNJJx/n5sR3WrTkx2MShkQ4ZkrJjUjw2vffee20+78orr5QkjR49evx+iRpy\nMGYMaHMgktvbJemGG26o7o5ViFv2HGAT11ZZZZW05hEPKCyOmhk8eHCbjzvMrhHbj0vh4+RZZ52V\n1mJrtr355puS8q2ll1xyiaT6CPwot2222UZSvs3fIyBaVaHW5BjUN/HEE0vqeCSEx2tsueWWbT4W\n20kdFlerx9eUU06Zts877zxJ7Y/FiOI1/YsvvihJuvXWW9NaDKwzj5bw7y3lz9P1Io7582gM77sk\nvf/++5LywVIeG1iIXxtJhQNVPS7D5zspG6kWr4HqkccNSdljolCgX2xXP/PMMyVlrwGkLHwpHpsb\n8Rx1yy23FPV5DnIbNmxYWvMx+Zdffklru+yyi6TmHoux3nrrpe34mLCvv/5aUn4sj4/FM8wwQ5vP\nLzS+Z80110xr9957rySpX79+ndntksWQv88//1ySdP7555fl+91+++2S8sGi/hv06NEjrfl3j4+/\n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\n9fHg2muvTWs+lgwePDitxcDEcvDjqVZjDmL70Q8//CApH97nY0mxrcGFWlHrXUeBfh7/Uu7/ozgC\nIwbCFCPus/crjqmptYkmyi5BXn31VUnS9ddfn9ZioE6zcattDLPxsfNvf/tbWmuW9tpai9cqDqaK\nI6B8jecQU0l68cUXq7R3lRPPSwMHDpSUD87p3bu3pCxcqRHEduL2xOCfUsXHTSE+96211lpprdbX\nsR9//HHa9gi3GKTla/rYjv6vf/1LkjR69OiifkYch+CxaTEI7+qrrx7f3a6JcoX8NZsYbu1RKvG6\n14HYcdxOI75ONof4SVkr/pZbbpnW2vv/j9fCHh1XD6P/ym3DDTeUVL7nggP6PFZEKv481Gxj084+\n++y07bA7j4JqdHPPPXfadkD1hRdemNb22msvSfnRTubxmlJ2LROfW832OCiFg8Djcage/i6N9yof\nAAAAAAAAAFAXWraCuT2uppXylbyN5sADD0zbrsKM1WuucohVh67C2HPPPdOaw5ccFiJJ008/vSTp\n8ssvT2uuZv3ss8/SWq0rOcotvuvmKrNYYei/QUfVjo3otNNOkyR16dIlrbmKIVa9eCi/35WUsne8\nY3DeiBEjKrav48sVXauttlpa82M3Bjs63NIhUZK0wgorSMqHg/pvdNVVV7X7c+eff35JWWWAJG2w\nwQZtPs+VFLUKXYqhhnF7fD355JOSshApSTrzzDMlNX6FULkrl8v992gvDLAeuGIqhuiUI0CznsSA\nVIcjxSrurbbaShJVy53lwD5J+vXXXyXlq15dXenKDyk7pnft2rUau1hxjz32mKR8wPITTzwhKV+Z\nN2rUqKruV6li9936669f1NfEip7xNcMMM0iSdtlll3Y/zwG99fp3PPbYYyVlHYZS1l3mbkIpq1I9\n44wz0trzzz8vKd+V6OdRoRBuV0HHr613MbDM27HDyh01m222WVor1IF13XXXVWoXayJWI/s6Pz42\nfL1z5513VnW/ys1h47FbytX5HYXZuZsvBjs3Y+WyHXrooZI6d23qjhkpO8YWa6WVVkrbfg7GgPRG\n5qBUKf9ashm4g1mSZpppJknSb7/9ltYKVS5bvD/lbmHkHy8nnHCCpKzrWsp3gtYKFcwAAAAAAAAA\ngJJwgxkAAAAAAAAAUBJGZARu0f3+++9rvCflEUd9uCV9jTXWSGsecxHD2NyCcs0116S1ZZZZRlI+\n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\nQmCC\n",
      "text/plain": [
       "<Figure size 2000x200 with 1 Axes>"
      ]
     },
     "metadata": {
      "tags": []
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Most True Negative\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABZgAAABoCAYAAAB8B5V6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3WecXHX5/vErCKg06U0IIjVBeu9g\nACHSBUKXEnqREhBIICBSpEdEIogiUgy99ypK70KoQRCkg5QfTcX8H/xf1/fcJ3MyOzs77cx+3o/O\n67u7s2dnZ86cOXPf9zVg4sSJEwUAAAAAAAAAQC9N0e4dAAAAAAAAAACUExeYAQAAAAAAAAB14QIz\nAAAAAAAAAKAuXGAGAAAAAAAAANSFC8wAAAAAAAAAgLpwgRkAAAAAAAAAUBcuMAMAAAAAAAAA6sIF\nZgAAAAAAAABAXbjADAAAAAAAAACoy5St/GUDBgxo5a8DAAAAAAAAADTAxIkTC9epYAYAAAAAAAAA\n1IULzAAAAAAAAACAunCBGQAAAAAAAABQFy4wAwAAAAAAAADqwgVmAAAAAAAAAEBduMAMAAAAAAAA\nAKjLlO3egUYYMGBA2v72t78tSRo9enRa23XXXWu6nUMOOUSSdPrpp6e1//3vf43YRQAAAAAAAADo\nOlQwAwAAAAAAAADqwgVmAAAAAAAAAEBdSjciY4opsmviw4YNkyStvfbaaa1oHMann34qqXjcxTTT\nTJO2TzrppIrvGzNmzGR/FkDvfOMb30jbZ511liRpp512Smt+Tl9++eUt3S8AAAAAqNVhhx2WthdZ\nZBFJ0gILLJDWVl99dUnSxIkTK3729ddfT9uDBw+WJP3f//1fU/YTAFqFCmYAAAAAAAAAQF1KV8E8\n++yzp+0tt9xSUvbpoCQ999xzkqRzzjknrV1zzTWSpFdeeaXi9kaNGpW2jzrqKEnSKaecktbuuOMO\nSdJTTz3V111HC80111ySpE033bTia/FxcNNNN/Xqdr/3ve+l7R//+MeSpJlmmimtPfroo33+Hd0i\nPlfXXHNNSdKIESPS2rLLLitJeuaZZ9Ja/DS/WU444QRJ0nzzzZfWnnjiCUnSH/7wh7T25ZdfSpI+\n/PDDqrfnx8TLL7+c1j777LPG7CzQj80xxxySpAUXXDCtPfbYY5Kkzz//vKafdfCvlFUXDRkypOL7\nhw8f3redrcGUU2anXF/72tcqvr7JJptIyr/O2DbbbJO2Y3VUNT62Hn300WntiiuuqOlnO53vy1gV\n9tVXX7Vrd5pq++23T9t//OMfJUkXXnhhWvvtb38rSfrLX/6S1rr1vuhUAwcOTNtTTz21JOmll15q\n1+6gwaaaaqq0Pf3001d8fb/99pOU74q1FVdcMW1fdtllkqRLLrkkrX300UeSeM52stlmm02StOOO\nO6a1H/3oR5KkFVZYIa0NGDCg4mf9GhVfq/xeZ5555klrs846qyQqmIH+Zt5555WUn8LgjoYtttgi\nrb3//vuSpA022CCtPfLII63YxV6jghkAAAAAAAAAUBcuMAMAAAAAAAAA6jJgYtHU+Wb9soLWkU5y\n7LHHSpKOOOKItOawsW233Tat0cbU+VZbbTVJ0t13313xtU8++SRtO5zhhhtuSGvVxjS89tpradtj\nOIrE3/Hqq69Kyka1SNLFF18sSXr++ecnextl4DblmWeeOa3tvffekrKWQUn61re+JSkflulWj1NP\nPTWtxfE0zfL2229LylreIo/YkbIRGhMmTEhrfmysvPLKac0tkf/+97/T2qWXXipJuuCCC6ruy733\n3iuJEFEpH/bo/1HZx8t41MHvf//7tLbccstJyrdLnnbaaZKkn/70p2mtv73OzDDDDJKkX/3qV2nN\noyzisdajaOLzrciMM84oKT/CyK3rRYpGVjTK17/+dUn545uPk63w5JNPpm2HIrstu0w23HDDtO1x\nRn4dkbLxR3HUUTccW6+66qq07TEqRWLbve+Lev7PDsaedtpp09obb7whqf8cl/ycjcdpv4fZfffd\n05pHYzigWMpGKMTzRY+riaNu2i0eV/faay9J2TgzKWvfv++++9KaW3h7Ov6Wkc9j4/msxxbE94Xx\nONQICy20kKT8uWYncTj3Pvvsk9Z8buP3N5L0ne98R1L+ORO/3ghx3FMrjR8/XlI2ZkvKxujF83y/\n9/PYPan4//rCCy9Ikh544IG0ttFGG0kq//vCWvn945gxY9La5ptvLqn6+2uU18ILLyxJGjp0aFrz\nqBlft5GyY4hHCknZOXM85yuz+DriY+t6661X089+8MEHadv3Sxx/18rz3sldRqaCGQAAAAAAAABQ\nFyqYg80220xSVrUcLb300mm7WwL/Nt54Y0n5ats4TNzmnHNOSdJaa61V9fYcTHD99ddXfC1Wvfj+\n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\nZWFF8fVoq622kpQP3ywzt1GPGDEirflYG4MlfU591VVXtXDv2sdjAxysGsUw2zLy/7xRLfRuzS0a\nldWfeZxOHA/hILwDDzywYu22225r4d5lIXHVxmL0lf/O+L7LI3o85kiSBg8e3LR96DYehxHb5Fsp\nnlsVnWf11qBBg9K2r8PEsTygSUpQAAANg0lEQVTxfVR/5fslnvO169y6E22//fZp26N8HPrcTTwG\n+OKLL05r8Thq77//vqTic+GddtqpOTtXAyqYAQAAAAAAAAB1KV0Fc/z0taiK1lV1ruyVpPnnn1+S\nNNtss1W9bX9CNHDgwLQWB2l3ivgpoqttbrjhhrT24osvVvyMPzV/+eWX01q1cLp4H1gczl8WMYgi\nhgHZ448/Lkk66aSTKr7minapuCL14YcfliRde+21fd7PZoqBczHAstlipb0r0DbddNO09r///U9S\n/jHZSRwA6k4JSZprrrkkZfsexTAxB3IssMACac2Pp/nmm6/q73UlTPxfHXrooZKyELBmOvbYY9O2\nq6hjMIw/QY2Bfl9++aUk6YMPPkhrRaEUrgaPnSNf+9rXJOVDg7wPndhB0mp33nlnu3ehqj/+8Y9p\n2wEUrQjHjc+jGIBjDpDrdD2dl8w000yS+hZc4q4DSZplllkqvu6g5FhJ1Eonn3xy2nZw0cILL5zW\n9tprL0n5quZGBP/EziVXK7tiXJLuv/9+SdKKK66Y1nysa5YYqOr9a/T/JXaauII5dgK6w6lbKphj\nYPP6668vSdp8883TWrVuIIfk4f974okn2r0LveZullaEhcXzXlfXxarMRofd1srvYWoNY4shf7Xy\nz8Twubhd7XdcccUVvf59zeLgMB//pezawsiRI9NaswK04nUOB7LGAFK//yhjIOIzzzyTtv1ep54u\npG7j8zwp6wC4++6727Q3nS0ew7z92GOPtWt3msbH7KKq5WjWWWeVlD+3d+dVDHluNSqYAQAAAAAA\nAAB14QIzAAAAAAAAAKAupRuRMcUU2TXxaaaZpuLrbr+IoTFucV9wwQWr3vaSSy4pSbrmmmvSmkcn\nnHrqqWmtFW1W1cTRIG6jd3vn5Lit57333ktrb7/9tqT8iAK3h55xxhlpzcPTd955577sdlvEIJIz\nzzxTUtZuK2UjNGJr/+9+97uabtutsu1qK67V+PHj03YMp2uWxRZbTFJ+tITbb+NoCQeCjB07tun7\n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\nAAAAqMv/A74B1qBGFlscAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 2000x200 with 1 Axes>"
      ]
     },
     "metadata": {
      "tags": []
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Most False Negative\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n+H8ERN2xfadiCgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 2000x200 with 1 Axes>"
      ]
     },
     "metadata": {
      "tags": []
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Most True Positive\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABZgAAABoCAYAAAB8B5V6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJztnWe4blV1th/TezcxiYnGgrGhYosC\n0qRXqYemVKniUepBRECqAiIgIIp0AiJVOoceJIBwBGuIWBM0UWNMM93vx3fdcz1r73HetsvZfN9z\n/9nvNff7rjLLmHOtOcZ4nvGTn/zkJwohhBBCCCGEEEIIIYQQxuSnVvQFhBBCCCGEEEIIIYQQQnh6\nkhfMIYQQQgghhBBCCCGEECYiL5hDCCGEEEIIIYQQQgghTEReMIcQQgghhBBCCCGEEEKYiLxgDiGE\nEEIIIYQQQgghhDARecEcQgghhBBCCCGEEEIIYSLygjmEEEIIIYQQQgghhBDCROQFcwghhBBCCCGE\nEEIIIYSJyAvmEEIIIYQQQgghhBBCCBPxM/N5smc84xlzctxVVlmlfV5ttdUkSUuXLm1lX/rSlyRJ\nP/VT3fv0//3f/5Uk/dIv/dK04+yxxx6t7MILL5Qk3XXXXbN92WND/f3kJz8Z+7e/93u/J0nac889\nWxl15Mf7+Z//eUnSRhtt1Mr+/d//XZJ01FFHtbLf+q3fkiT9wz/8w9jXEuYXH3eD+s6f/dmftc9r\nrrmmJOnBBx9sZcuWLZMk/fM//3Mr+7mf+zlJ0vOf//xW9rKXvUyS9MxnPrOVMQbvuOOOWb3mpxPY\nH7+3//mf/xnpt3/6p38qSfrKV76y3ONKnV2bD376p3+6fR71PoJ04oknSpI23HDDVvaf//mfkqTv\nfe97rezwww+XJH3uc5+bx6ubH6q5bIsttpAk/fEf/3ErO/300+f3wkIITxuGzX0777yzpL5N4Xv+\n/ec+97mSpH333beVYZt8nuM3breq55r5WLPMZD0Bw57Jqv+Pusag3ryN/uu//muMq5sffB7+hV/4\nBUnSeuut18q+//3vS5I++9nPtrJXvOIVkqRbbrmllT311FOSpL/5m7+Zu4udZT7ykY9Ikn7xF3+x\nlX3rW9+S1O/3v/3bvy1J+o3f+I1W9oMf/GDa8X75l39ZUr/Neab04/H8yHOpJK2++uqSpH/8x3+c\n5FbCHDHqs9h73/ve9nmllVaa9n36mNsAyv7+7/++lf3whz+UJD355JOt7GMf+9icXHMITzfo28PW\nPvT7Yd/jGcvHzDve8Y5p3+M4g8417TdlaQghhBBCCCGEEEIIIYQwhHn1YJ5t1l13XUnSu9/97lbG\nzvKmm27aylZeeWVJnSeu1L2FZ8dakr7+9a9Lkl70ohe1MjzL2IWVpO9+97uS5sezbJiHAdf1whe+\nsJXttttukqR//dd/bWUf/ehHJUkveMELWhl19Ad/8AetDI/U3/3d3512PLzDpc4z5Nvf/nYru+ii\niyRJ//RP/9TKshu94qm8bQ444IBWttlmm0nqvAqkbly4hwEehv49+h9jQpJ+9KMfSep2sSXptNNO\nkyTtv//+rYzogVNOOWXgNT9d8J3CykNzVM8fjnPrrbe2sj/5kz+R1N/JP+mkk3rnmkvcu522fP3r\nX9/KPv/5z0uSDj300Gll9Aep8373a/7VX/1VSdLv//7vtzJszsEHH9zKqMuTTz65lfn5VjSDIkyu\nvPLKad/bcccdWxneGgceeGAru+yyyyR1XkZTPz/dqHbS3/Wud7UybM7999/fys4991xJ/R31//iP\n/5AUD/q54HWve137/NBDD037/0yiqEKYBPqczxmVFzJ4BOJ+++0nSfqXf/mXVva1r31NUn/tv/XW\nW0uS/u7v/q6VEbFX2Ra/lkGePXPJuOd705ve1D4/8sgjkvrPCBXVOF9nnXUk9evl7rvvnvY9/j/M\nNs+VTam8GF/60pe2smOPPVaS9OMf/7iV3XvvvZKkxx9/vJXRX1784he3shtuuEGS9MY3vrGVsY7+\n+Mc/3so++clPSlpxUWbD4Jr9me01r3mNpH4EYsXP/Mz/fX3gHqm0tXtE08e8r/EbPKOlLgqSvhnm\nn6qfVuPS+/juu+8uSTr11FNbGXbX+9Wo0A/8WZFIabczW2655XKPMRNbQr+WpP/+7/+WJP3hH/5h\nK+M+/+qv/qqVVZ77/HYY2B+3k1XdM2b+7d/+rZX5+abi9o978jlv1VVXlSRtvvnmrYz3Xf+/QLS1\ne8vTHgvVC55r8f5CP6j6n883jK1Fixa1smc/+9mSuj4sSW95y1skSddcc00rm2TeigdzCCGEEEII\nIYQQQgghhInIC+YQQgghhBBCCCGEEEIIE7GgU2S8+c1vbp/f9773SeqHKvz6r/+6pH7qC9zCPYzg\n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\n",
      "text/plain": [
       "<Figure size 2000x200 with 1 Axes>"
      ]
     },
     "metadata": {
      "tags": []
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "(<Figure size 2000x200 with 1 Axes>,\n",
       " <matplotlib.axes._subplots.AxesSubplot at 0x7f3051175128>)"
      ]
     },
     "execution_count": 0,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Sorted_ims = tf.gather(DoSE_admin.eval_ims, tf.argsort(DoSE_admin.eval_lp))\n",
    "Sorted_labels = tf.gather(DoSE_admin.eval_label, tf.argsort(DoSE_admin.eval_lp))\n",
    "sorted_ind = tf.gather(Sorted_ims, tf.where(Sorted_labels == False))[:,0]\n",
    "sorted_ood = tf.gather(Sorted_ims, tf.where(Sorted_labels == True))[:,0]\n",
    "\n",
    "print(\"Most False Positive\")\n",
    "tfn.util.display_imgs(sorted_ind[:20])\n",
    "print(\"Most True Negative\")\n",
    "tfn.util.display_imgs(sorted_ind[-20:])\n",
    "print(\"Most False Negative\")\n",
    "tfn.util.display_imgs(sorted_ood[-20:])\n",
    "print(\"Most True Positive\")\n",
    "tfn.util.display_imgs(sorted_ood[:20])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "VLDpJs-u1N3j"
   },
   "source": [
    "DoSE on this particular classifier appears to get 0.982-0.993 AUROC and 0.982-0.993 AUPRC.  This is comparable to the accuracy of the classifier itself, but was trained without access to the OOD dataset in question."
   ]
  }
 ],
 "metadata": {
  "colab": {
   "collapsed_sections": [],
   "name": "VIB + DoSE",
   "toc_visible": true
  },
  "kernelspec": {
   "display_name": "Python 3",
   "name": "python3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
